如何使用MySQL获得类似透视表的结果

如何使用MySQL获得类似透视表的结果,mysql,excel,pivot,Mysql,Excel,Pivot,假设我们在mysql中有一个表:test 如何在excel中获得类似pivot表的结果表 尝试使用“合并”,但mysql不支持 尝试使用“联合”,但增加的是索引,而不是列 select * from test; 输出 +----+------------+------+-------+ | id | date | name | value | +----+------------+------+-------+ | 1 | 2019-01-01 | a | 1 |

假设我们在mysql中有一个表:test
如何在excel中获得类似pivot表的结果表

尝试使用“合并”,但mysql不支持

尝试使用“联合”,但增加的是索引,而不是列

select * from test;
输出

+----+------------+------+-------+
| id | date       | name | value |
+----+------------+------+-------+
|  1 | 2019-01-01 | a    |     1 |
|  2 | 2019-01-02 | a    |     2 |
|  3 | 2019-01-03 | a    |     3 |
|  4 | 2019-01-04 | a    |     4 |
|  5 | 2019-01-05 | a    |     5 |
|  6 | 2019-01-06 | a    |     6 |
|  7 | 2019-01-03 | b    |     9 |
|  8 | 2019-01-04 | b    |     9 |
|  9 | 2019-01-05 | b    |     8 |
| 10 | 2019-01-06 | b    |     7 |
| 11 | 2019-01-05 | c    |     5 |
| 12 | 2019-01-06 | c    |     6 |
| 13 | 2019-01-07 | c    |     7 |
| 14 | 2019-01-08 | c    |     8 |
| 15 | 2019-01-09 | c    |     9 |
+----+------------+------+-------+
想要得到:

+------------+---+---+---+
| date       | a | b | c |
+------------+---+---+---+
| 2019-01-01 | 1 |   |   |
| 2019-01-02 | 2 |   |   |
| 2019-01-03 | 3 | 9 |   |
| 2019-01-04 | 4 | 9 |   |
| 2019-01-05 | 5 | 8 | 5 |
| 2019-01-06 | 6 | 7 | 6 |
| 2019-01-07 |   |   | 7 |
| 2019-01-08 |   |   | 8 |
| 2019-01-09 |   |   | 9 |
+------------+---+---+---+
我知道在Excel中很容易得到结果,但是如何使用SQL呢

编辑:

接着是一个问题

如果我不知道“名称”列中的名称,该怎么办

也就是说,可能有a、b、c、d、e、f、g……但我不知道有多少不同的名字

如何通过列出它们来获得结果?()


您可以使用
CASE
GROUP\u CONCAT
来获得所需的输出。好的做法是避免使用诸如
name
date
value

SELECT date,
GROUP_CONCAT(CASE WHEN name='a' THEN value END) as 'a', 
GROUP_CONCAT(CASE WHEN name='b' THEN value END) as 'b', 
GROUP_CONCAT(CASE WHEN name='c' THEN value END) as 'c' 
FROM test GROUP BY `date`;
编辑: 可以通过使用
prepared语句
创建动态查询来实现

由于
value
要在特定日期对某列求和,因此与
SUM
共享查询。如果需要,您可以用
组\u CONCAT
替换

SELECT 
GROUP_CONCAT(CONCAT(" SUM(CASE WHEN name='",name,"' THEN value END) AS '",name,"'")) 
INTO @pivotcol
FROM (SELECT `name` FROM test GROUP BY `name`) t;

SET @pivotquery =CONCAT("SELECT date, ",@pivotcol," from test GROUP BY `date`");

PREPARE stmt FROM @pivotquery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

在第二个问题中考虑应用程序代码中的数据显示问题,尝试在@ JAMESWOW提出的查询中更改<代码> GROPYCONTAT < /代码>到<代码>和> /代码>!那是布莱利安!第一次使用stackoverflow时,不知道如何在此注释框中添加一些代码或sql结果。我有一个问题,如果有效的话。关闭已解决的线程。你可以通过接受下箭头下方左侧的答案来完成,这里有一个勾号。。你只能做出一个被接受的答案。顺便说一下,如果你在同一个问题中问了另一个被回答/未回答的问题,并不是所有的人都能帮助你。只有很少的通知和信息可以帮助你。编辑:如果你有更多的问题要问,你也可以编辑你的问题。再次感谢你的帮助,我用sum而不是group_concat来获得满意的答案。我已经接受了你的回答,这是否意味着这是一个已解决的线程?但我还有一个问题,是否有任何限制,任何人都不能对已解决的问题发表评论?
SELECT 
GROUP_CONCAT(CONCAT(" SUM(CASE WHEN name='",name,"' THEN value END) AS '",name,"'")) 
INTO @pivotcol
FROM (SELECT `name` FROM test GROUP BY `name`) t;

SET @pivotquery =CONCAT("SELECT date, ",@pivotcol," from test GROUP BY `date`");

PREPARE stmt FROM @pivotquery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;