2017-08-01 50 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