如何使用MySQL获得类似透视表的结果
假设我们在mysql中有一个表:test如何使用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 |
如何在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;