我正在尝试在mysql中进行动态调整

时间:2019-11-21 18:22:06

标签: mysql pivot

我正在尝试在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

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;