我正在尝试在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(当subject =“ MATEMATICA”并且 media = 0.0000000 THEN 1 ELSE'row 1
答案 0 :(得分:2)
当您尝试将subject
用作列别名时,似乎导致了语法错误。您不能将数字常量用作列别名:
mysql>选择'test'为123.000;
错误1064(42000):您有一个错误 用你的SQL语法;查看与您的MySQL相对应的手册 在第1行的'123.000'附近使用正确语法的服务器版本
因此,您应引用subject
的值,以免这样做。
我建议使用builtin QUOTE() function,如果值是包含撇号的字符串,它将使用引号引起来,甚至进行转义。
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;