MySQL - 将一 Column/Three 行重组为三 Columns/One 行?
MySQL - Reorganizing One Column/Three Rows into Three Columns/One Row?
我是 mySQL 的新手,正在努力完成以下任务。我有一个 table, 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,中码没有出现在第一个 table;因此它的值在第二个 table.
中为 0
有什么建议吗?指针?我认为解决方案是这样的:
SELECT item 'ITEM', if(ITEM=1001 and SIZE=???, SIZE) 'SMALL', ...etc...
FROM t1;
但这就是我得到的。
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" 它们,您可以这样做而不是最大计数。在这种情况下,最大意味着每个项目和大小有 1 条记录;否则你会丢失数据。
当不存在这样的记录时,可以使用合并来根据需要替换 0。或者不使用 coalesce 并允许值为 NULL。
我的回答(出于所有意图和目的)与@xQbert 相同,但使用 "create table as select" 将值直接放入新的 table。
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 关键字,虽然不是必需的,但我习惯性地反引号任何看起来像关键字的东西。
我是 mySQL 的新手,正在努力完成以下任务。我有一个 table, 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,中码没有出现在第一个 table;因此它的值在第二个 table.
中为 0有什么建议吗?指针?我认为解决方案是这样的:
SELECT item 'ITEM', if(ITEM=1001 and SIZE=???, SIZE) 'SMALL', ...etc...
FROM t1;
但这就是我得到的。
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" 它们,您可以这样做而不是最大计数。在这种情况下,最大意味着每个项目和大小有 1 条记录;否则你会丢失数据。
当不存在这样的记录时,可以使用合并来根据需要替换 0。或者不使用 coalesce 并允许值为 NULL。
我的回答(出于所有意图和目的)与@xQbert 相同,但使用 "create table as select" 将值直接放入新的 table。
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 关键字,虽然不是必需的,但我习惯性地反引号任何看起来像关键字的东西。