MySQL - 将一列/三行重组为三列/一行?

时间:2017-08-01 17:51:20

标签: mysql subquery nested-query

我对mySQL完全陌生,并且正在努力完成以下任务。我有一个表t1,其中列出了三列:

ITEM    SIZE    COUNT
------------------------
1001    small   11
1001    medium  6
1001    large   34
1002    small   10
1002    large   23
1003    small   81
1003    medium  12
1003    large   38  
...etc...

此数据持续数百个元组。我最终需要做的是重新计算这样的计数:

ITEM   SMALL   MEDIUM   LARGE
-----------------------------
1001   11      6        34
1002   10      0        23
1003   81      12       38

...等...

请注意,项目1002,中等大小不会出现在第一个表格中;因此在第二个表中它的值为0。

有什么建议吗?指针?我假设解决方案是这样的:

SELECT item 'ITEM', if(ITEM=1001 and SIZE=???, SIZE) 'SMALL', ...etc...
FROM t1;

但就我而言。

2 个答案:

答案 0 :(得分:2)

Rextester示例:http://rextester.com/VRVPKM75531

透视或条件聚合(mysql不支持数据透视)

SELECT item 'ITEM'
     , coalesce(max(case when size = 'small' then count end),0) as SMALL
     , coalesce(max(case when size = 'medium' then count end),0) as MEDIUM
     , coalesce(max(case when size = 'large' then count end),0) as LARGE
FROM t1
GROUP BY ITEM

如果每个项目大小有多个计数,并且您需要“SUM”它们,那么您可以执行此操作而不是最大值。在这种情况下,Max意味着每个项目和大小1个记录;或者你会丢失数据。

当没有这样的记录存在时,可以根据需要替换0来使用合并。或者不使用coalesce并允许值为NULL。

答案 1 :(得分:2)

我的回答是(出于所有意图和目的)与@xQbert相同,但使用"创建表作为选择"将值直接放入新表中。

CREATE TABLE t2 AS
  SELECT
    ITEM,
    SUM(CASE WHEN SIZE = "small" THEN `COUNT` ELSE 0 END) AS "SMALL",
    SUM(CASE WHEN SIZE = "medium" THEN `COUNT` ELSE 0 END) AS "MEDIUM",
    SUM(CASE WHEN SIZE = "large" THEN `COUNT` ELSE 0 END) AS "LARGE"
  FROM t1
  GROUP BY ITEM;

我在count周围使用反引号作为mySQL关键字,虽然不需要我习惯性地反复任何看似关键字的东西。