2014-09-23 59 views
0

我可能已經讀了十幾個類似的線程,但是我一直無法使用它們來解決我的問題。我很接近,也許離解決方案只有一兩步之遙。如何在SQL中將多個行合併爲一個

我有我加載數據到這類似於這樣的表:

​​

我想要的是將它們組合成一個單一行:

CustName | Model | Serial | GreenCount | BlueCount | RedCount 
Freds | 123AB | L23456 | 987  | 1127  | 
Jimmys | 111SS | L11234 |   | 2245  | 
Erikas | 123AB | L11331 | 19   | 10  | 12 

的序列號是唯一的所以我嘗試使用T1.Serial = T2.Serial和T1.Serial = T3.Serial內部連接T1至T2以及T1至T3,但仍然使用NULLS獲取行,例如Erikas返回5行,其中只有一行擁有所有數據

我試着用在哪裏 「T1.MonthlyCount」(ETC)IS NOT NULL,但沒有任何篩選出的行:

Select T1.CustName 
     ,T1.Model 
     ,T1.Serial 
     ,(Select T1.MonthlyCount Where T1.Color = 'BLUE') As BlueCount 
     ,(Select T2.MonthlyCount Where T2.Color = 'GREEN') As GreenCount 
     ,(Select T3.MonthlyCount Where T3.Color = 'RED') As RedCount 
From Table1 T1 

Inner Join Table2 T2 
on T1.Serial = T2.Serial 

Inner Join Table3 T3 
on T1.Serial = T3.Serial 

Where T1.MonthlyCount IS NOT NULL 
AND T2.MonthlyCount IS NOT NULL 
AND T3.MonthlyCount IS NOT NULL 

Group By Serial, CustName, Model, Color, MonthlyCount 

什麼我得到的是:

CustName | Model | Serial | GreenCount | BlueCount | RedCount 
Freds | 123AB | L23456 | NULL  | NULL  | NULL 
Freds | 123AB | L23456 | 987  | NULL  | NULL 
Freds | 123AB | L23456 | NULL  | 1127  | NULL 
Freds | 123AB | L23456 | 987  | 1127  | NULL <--Expected 
Jimmys | 111SS | L11234 | NULL  | NULL  | NULL 
Jimmys | 111SS | L11234 | NULL  | 2245  | NULL <--Expected 
Erikas | 123AB | L11331 | NULL  | NULL  | NULL 
Erikas | 123AB | L11331 | 19   | NULL  | NULL 
Erikas | 123AB | L11331 | NULL  | 10  | NULL 
Erikas | 123AB | L11331 | NULL  | NULL  | 12 
Erikas | 123AB | L11331 | 19   | 10  | 12  <--Expected 

我只查找標記爲Expected的上述3行。任何援助將不勝感激。

+0

您當前嘗試的許多問題。不過,我會首先建議你谷歌「SQL PIVOT」。 – 2014-09-23 18:31:43

回答

3
Select T1.CustName 
     ,T1.Model 
     ,T1.Serial 
     ,SUM(CASE WHEN Color = 'Blue' THEN MonthlyCount ELSE 0 END) BlueCount 
     ,SUM(CASE WHEN Color = 'Green' THEN MonthlyCount ELSE 0 END) GreenCount 
     ,SUM(CASE WHEN Color = 'Red' THEN MonthlyCount ELSE 0 END) RedCount 
From Table1 T1 
Group By Serial, CustName, Model 
+1

''BLUE''而不是''Blue'' ;-) – 2014-09-23 18:43:07

+0

結果與我上面發佈的完全相同。 – user2233506 2014-09-23 18:55:57

+0

@ user2233506這個查詢按'CustName,Model,Serial'分組,這意味着它們將不會像上面的結果一樣重複 – FuzzyTree 2014-09-23 19:00:57

4

使用條件聚合,並且只按您希望在每一行中唯一的列進行聚合。而且,你有更多的聯結,而不是必要的。沒有必要。

Select T1.CustName, T1.Model, T1.Serial, 
     sum(case when T1.Color = 'BLUE' then t1.MonthlyCount else 0 end) As BlueCount, 
     sum(case when T1.Color = 'GREEN' then t1.MonthlyCount else 0 end) As GreenCount, 
     sum(case when T1.Color = 'RED' then t1.MonthlyCount else 0 end) As RedCount 
From Table1 T1 
Group By T1.CustName, T1.Model, T1.Serial; 

如果你想NULL,而不是0,請從每個條款的else 0

Here是一個SQL小提琴,演示它的工作原理。

+0

結果與我上面發佈的完全一樣。強制我將顏色添加到分組依據。 – user2233506 2014-09-23 18:56:53

+0

@ user2233506。 。 。此查詢將爲每個客戶名稱,型號和序列生成一行。你的結果(至少在問題結束時)有這些值在行間重複。我不認爲這會產生相同的結果。 – 2014-09-23 18:59:34

+0

它迫使我添加顏色組,我相信它是這樣做的原因。 – user2233506 2014-09-23 19:02:15