将MySQL中的行数据转换为列数据

4

我有一个MySQL表格,它以这种格式存储数据

Type|Month|Count
----+-----+-------
1   |9    |4
3   |9    |7
99  |9    |2
1   |10   |6
3   |10   |7
99  |10   |9
.......

Type列可包含1、3、99中的任意一个值。 Month将包含1到12之间的值。 Count可以是任何随机数。

我期望的输出类似于这样:

Month|Type1|Type3|Type99
-----+-----+-----+-------
9    |4    |7    |2
10   |6    |7    |9
................

我看到了这个演示 Demo 但是不太理解。

这里有一个带有演示数据的 fiddle 的样例。

需要任何帮助都可以得到支持。


请至少使用您的示例数据创建一个 Fiddle。 - Mihai
添加了一个链接,可以使用示例数据进行演示。 - Nilesh Barai
1个回答

8
尝试以下查询,你需要了解的是MYSQL透视表,以下查询可以解决你的问题。 静态方式
SELECT Month, 
 SUM(CASE WHEN Type = 1 THEN 'count' ELSE 0 END) AS Type1,
 SUM(CASE WHEN Type = 3 THEN 'count' ELSE 0 END) AS Type3,  
 SUM(CASE WHEN Type = 99 THEN 'count' ELSE 0 END) AS Type99
FROM my_table
GROUP BY Month

动态方式

使用GROUP_CONCATCONCAT函数。

SET @sql = NULL;
SELECT
    GROUP_CONCAT(DISTINCT 
    CONCAT('SUM(CASE WHEN Type= ', 
    Type, ' THEN count ELSE 0 END) AS '
    , 'Type', Type))
INTO @sql
FROM
  my_table;

SET @sql = CONCAT('SELECT Month, ', @sql, ' 
                  FROM my_table 
                   GROUP BY Month');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

@Nilesh Barai,这个有帮助吗? - Abhishek Gupta
它不起作用。它显示类型3和类型99列的值为0。 - Nilesh Barai
这是我需要的。简单而优雅! - Nilesh Barai
1
@Mihai:你不是唯一知道MySQL的人,请参考http://stackoverflow.com/questions/26263917/sql-loop-with-data-aggregation/26264344#26264344。 - Abhishek Gupta
@Mihai:我是从自己的概念中复制粘贴的,请参考该链接。 - Abhishek Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接