2017-08-01 113 views
0

我对mySQL是完全陌生的,我正在努力完成下面的任务。我有一个表格t1,其中列出了三列:MySQL - 将一列/三行重组为三列/一行?

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; 

但是,就我所知。

+0

认真考虑处理应用程序代码 – Strawberry

回答

2

我的答案是(对于所有意图和目的)与@xQbert相同,但使用“create table as select”将值直接放入新表中。

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的关键字,虽然不要求我习惯性地反引号,看起来像一个关键字的任何事情。

+0

我习惯性地反拨任何一个保留字:P或我重命名表。 – xQbert

+0

@彼得赖特是的!这工作。谢谢你,先生。 – Pete

+0

很高兴听到@Pete这是一个基本的解决方案,但应该禁止任何不可预见的问题。 –

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。

+0

中的数据显示问题谢谢,但我不确定这是完整的答案。下面是我得到的结果:(不幸的是,我不能将表格作为表格发布,所以这是一个口头描述......)'ITEM'是正确的。但是,每个“小”,“中”和“大”列都具有相同的值:分别为1/2/0。这是第一个元组的正确答案,但不是第二个元组。是否可能存在“独特”或“分组依据”命令或其他内容,以便第一个元组的结果不会被克隆到表中?谢谢 – Pete

+0

小组应该解决这个例子:但也许我'错过了一些东西:http://rextester.com/VRVPKM75531 – xQbert

+0

或者我可能没有描述得很好。 :) – Pete