我正在尝试在mysql中进行动态透视,但它说我有一个语法错误,我该如何纠正?
MySql 7
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(CASE WHEN subject = "',
subject,'" AND ',
(CASE WHEN media IS NOT NULL
THEN CONCAT("media = ",media)
ELSE media IS NULL END),
' THEN 1 ELSE 0 end) AS ',
subject, IFNULL(media,'')
)
)
INTO @sql
FROM
cs_media_simonline;
SET @sql = CONCAT('SELECT user_id, ', @sql, '
FROM cs_media_simonline
GROUP BY user_id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
这是错误:
'.0000000,SUM(CASE WHEN 主题 = "MATEMATICA" 和 媒体 = 0.00000000 然后 1 个其他第 1 行
当您尝试将其用作列别名时,您的
subject
似乎导致了语法错误。不能将数字常量用作列别名:MySQL>选择"测试"作为123.000;
错误 1064 (42000(: 您有一个错误 在你的 SQL 语法中;检查与您的 MySQL 相对应的手册 在第 1 行的"123.000"附近使用正确语法的服务器版本
所以你应该引用subject
的值,这样它就不会这样做。
我建议使用内置的 QUOTE(( 函数,如果值是包含撇号的字符串,它将负责引用甚至处理转义。
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(CASE WHEN subject = ',
QUOTE(subject),' AND ',
(CASE WHEN media IS NOT NULL
THEN CONCAT('media = ',media)
ELSE 'media IS NULL' END),
' THEN 1 ELSE 0 end) AS ',
QUOTE(subject), IFNULL(media,'')
)
)
INTO @sql
FROM
cs_media_simonline;