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



我是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;

但这就是我所得到的。

我的答案是(出于所有意图和目的(与@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;

我在计数周围使用反引号,因为它是一个 mySQL 关键字,虽然不是必需的,但我习惯性地反引号任何看起来像关键字的东西。

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

如果每个项目大小有多个计数,并且需要"求和"它们,则可以执行此操作而不是最大值。 在这种情况下,最大值意味着每个项目和大小 1 条记录;否则您将丢失数据。

当不存在此类记录时,可以使用合并来根据需要替换 0。 或者不使用合并并允许值为 NULL。

最新更新