大家早上好
我有一个名为 salesData 的 View ,它基本上看起来像这样,我想动态地旋转它,因为它可能会在以后更新。
+-------------+------------+------+
| salesTotal | salesYear | |
+-------------+------------+------+
| 3016207 | 2008 | |
| 3079627 | 2009 | |
| 3133681 | 2010 | |
| 3102944 | 2011 | |
| 3126710 | 2012 | |
| 3123600 | 2013 | |
| 3116452 | 2014 | |
| 3175186 | 2015 | |
| 122371 | 2016 |
+-------------+------------+------+
我设计了以下查询,但它似乎不起作用。 MySQL Workbench 给我一条奇怪的错误信息:
Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' MAX(CASE WHEN salesYear='2008 THEN 3016207 ELSE 0 END) AS 2008,MAX(CASE WHEN sa' at line 1
我的查询如下:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN salesYear=''',salesYear,''' THEN ',salesTotal, ' ELSE 0 END) AS ',salesYear))
INTO @sql
FROM salesData;
SET @sql = CONCAT('SELECT, ', @sql, ' FROM salesData');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
如果有人能给我提示,我将不胜感激。非常感谢:))
哦,顺便说一句,我正在寻找的结果是这样的:
| 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | |
+---------+---------+---------+---------+---------+---------+---------+---------+--+
| 3133681 | 3133681 | 3133681 | 3102944 | 3126710 | 3126710 | 3126710 | 3126710 | |
+---------+---------+---------+---------+---------+---------+---------+---------+--+
我使用以下查询得到它,但这个问题的重点是使查询非常动态 ;)) :
SELECT
MAX(CASE WHEN (salesYear='2010') THEN salesTotal ELSE 0 END) AS '2008',
MAX(CASE WHEN (salesYear='2010') THEN salesTotal ELSE 0 END) AS '2009',
MAX(CASE WHEN (salesYear='2010') THEN salesTotal ELSE 0 END) AS '2010',
MAX(CASE WHEN (salesYear='2011') THEN salesTotal ELSE 0 END) AS '2011',
MAX(CASE WHEN (salesYear='2012') THEN salesTotal ELSE 0 END) AS '2012',
MAX(CASE WHEN (salesYear='2012') THEN salesTotal ELSE 0 END) AS '2013',
MAX(CASE WHEN (salesYear='2012') THEN salesTotal ELSE 0 END) AS '2014',
MAX(CASE WHEN (salesYear='2012') THEN salesTotal ELSE 0 END) AS '2015',
MAX(CASE WHEN (salesYear='2012') THEN salesTotal ELSE 0 END) AS '2016'
FROM salesData
编辑:我发现了错误。此表达式中的 salesYear 未正确连接。
GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN salesYear=''',salesYear,''' THEN ',salesTotal, ' ELSE 0 END) AS ',salesYear))
当我用如下所示的字符串值替换它时,查询完美运行。任何人都知道如何将 salesYear 变量放在单引号之间?
GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN salesYear=''',salesYear,''' THEN ',salesTotal, ' ELSE 0 END) AS ','test'))
最佳答案
CONCAT('"',salesYear,'"') 有效。单引号好像不行:)
关于带组连接的 MySQL 动态数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34831111/