繁体   English   中英

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

[英]How to get a pivot-table like result using MySQL

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

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

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

select * from test;

Output

+----+------------+------+-------+
| 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...但我不知道有多少不同的名字。

如何通过列出所有这些来获得结果? ()

+------------+---+---+---+
| date       | a | b | c |...... and so on.
+------------+---+---+---+

您可以使用CASEGROUP_CONCAT来获得所需的 output。 好的做法是避免保留字如namedatevalue

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 statement创建动态查询来实现。

由于要value特定日期的列求和,因此与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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM