如何在SQL中将多个行合并为一个

问题描述:

我可能已经读了十几个类似的线程,但是我一直无法使用它们来解决我的问题。我很接近,也许离解决方案只有一两步之遥。如何在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

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

使用条件聚合,并且只按您希望在每一行中唯一的列进行聚合。而且,你有更多的联结,而不是必要的。没有必要。

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