带组连接的 MySQL 动态数据透视表

标签 mysql sql

大家早上好

我有一个名为 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/

相关文章:

sql - SQL Server 2014 中类似于 DATEDIFF_BIG 的自定义代码

mysql - 查找具有多个链接行的行

mysql - SQLite 比 MySQL 快?

sql - 是否可以使用 SELECT FROM DUAL 获得多行?

where子句中的MySQL错误?

php - FileMaker 安全问题

php - php中的日期和电话号码格式

java - 尝试使用 jtable 更新 mysql 表中的数据

php - Mysql Insert into复制数据

mysql - SUBSTRING_INDEX 获取第 n 个值