如何解决动态mysql枢纽分析表失败
X_train = data_consumption[:'2019'].drop(['DAILY_AQI_VALUE'],axis = 1)
y_train = data_consumption.loc[:'2019','DAILY_AQI_VALUE']
上面是从中获得ID和ID或手机号码(AssertionError Traceback (most recent call last) <ipython-input-64-b7ef74aa038e> in <module>
----> 1 X_train = data_consumption[:'2019-01'].drop(['DAILY_AQI_VALUE'],axis = 1)
2 y_train = data_consumption.loc[:'2016','DAILY_AQI_VALUE']
~\.conda\envs\UU_Smog\lib\site-packages\pandas\core\frame.py in
__getitem__(self,key) 2883 # either we have a slice or we have a string that can be converted 2884 # to a slice for partial-string date indexing
-> 2885 return self._slice(indexer,axis=0) 2886 2887 # Do we have a (boolean) DataFrame?
~\.conda\envs\UU_Smog\lib\site-packages\pandas\core\generic.py in
_slice(self,slobj,axis) 3555 Slicing with this method is *always* positional. 3556 """
-> 3557 assert isinstance(slobj,slice),type(slobj) 3558 axis = self._get_block_manager_axis(axis) 3559 result = self._constructor(self._mgr.get_slice(slobj,axis=axis))
AssertionError: <class 'numpy.ndarray'>
是CREATE TABLE `tUSER` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,`id_number` varchar(20) NOT NULL,`first_names` varchar(100) NOT NULL,`last_name` varchar(100) NOT NULL
PRIMARY KEY (`id`),INDEX( `id_number`,`first_names`,`last_name`)
)
CREATE TABLE `tPROFILE` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,`tUSER_id` bigint(20) DEFAULT NULL,`tTYPES_id` bigint(20) DEFAULT NULL,`value` varchar(100) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `unique_index` (`tUSER_id`,`tTYPES_id`),INDEX( `tUSER_id`,`tTYPES_id`,`value`)
)
CREATE TABLE `tTYPES` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,`type` varchar(100) NOT NULL DEFAULT '',`description` varchar(255) NOT NULL,`deleted` tinyint(1) NOT NULL DEFAULT '0',FULLTEXT( `type`,`description`)
)
表中的记录)时需要获取数据透视表的架构
我的静态数据透视表有效,因为我已经填充了表格并知道了类型
Cellphone
我需要一个动态数据透视查询,因为我永远不会知道类型 以下是我目前的工作,但它告诉我无法解决的语法错误
tTYPES
错误
select tUSER.*,max(CASE WHEN tTYPES.type = 'msisdn' THEN tPROFILE.value ElSE 0 END) AS 'msisdn',max(CASE WHEN tTYPES.type = 'network' THEN tPROFILE.value ELSE 0 END) AS 'network',max(CASE WHEN tTYPES.type = 'points' THEN tPROFILE.value ELSE 0 END) AS 'points',max(CASE WHEN tTYPES.type = 'card number' THEN tPROFILE.value ELSE 0 END) AS 'card number',max(CASE WHEN tTYPES.type = 'gender' THEN tPROFILE.value ELSE 0 END) AS 'gender'
from e1m_test.tUSER
inner join e1m_test.tPROFILE on tPROFILE.tUSER_id = tUSER.id
inner join e1m_test.tTYPES on tPROFILE.tTYPES_id = tTYPES.id
where tUSER.id = 312
任何帮助或指导都将受到欢迎
解决方法
大概tTYPE
中有一些类型与MySQL关键字(例如,number
是一种语言关键字)冲突。您需要使用反引号将这些标识符引起来。
其他建议:
-
我看不到为什么在生成条件表达式的查询中需要表
中似乎是不必要的tPROFILE
的原因;相应地,distinct
在group_concat()
-
我建议对字符串文字使用单引号而不是双引号-尽管MySQL允许这样做,但它与ANSI SQL标准有所不同,因为没有附加值(您只需要适当地转义嵌入式单引号即可)
-
无需在
concat()
中使用group_concat()
;聚合函数愉快地接受一个参数列表,并且似乎将它们连接起来
所以:
SET @sql = NULL;
SELECT GROUP_CONCAT(
'MAX(CASE WHEN tTYPES.type=''',tTYPES.type,''' THEN tPROFILE.value ELSE 0 END) AS `','`'
) INTO @sql
FROM tTYPES;
SET @sql = CONCAT('select tUSER.*,',@sql,'
from tUSER
left join tPROFILE on tPROFILE.tUSER_id = tUSER.id
left join tTYPES on tPROFILE.tTYPES_id = tTYPES.id
where tUSER.id = 312'
);
-- debug your query before running it!
-- SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。