如何在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行。任何援助将不胜感激。
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
''BLUE''而不是''Blue'' ;-) – 2014-09-23 18:43:07
结果与我上面发布的完全相同。 – user2233506 2014-09-23 18:55:57
@ 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小提琴,演示它的工作原理。
结果与我上面发布的完全一样。强制我将颜色添加到分组依据。 – user2233506 2014-09-23 18:56:53
@ user2233506。 。 。此查询将为每个客户名称,型号和序列生成一行。你的结果(至少在问题结束时)有这些值在行间重复。我不认为这会产生相同的结果。 – 2014-09-23 18:59:34
它迫使我添加颜色组,我相信它是这样做的原因。 – user2233506 2014-09-23 19:02:15
您当前尝试的许多问题。不过,我会首先建议你谷歌“SQL PIVOT”。 – 2014-09-23 18:31:43