2014-09-23 3 views
0

Я, вероятно, прочитал дюжину похожих тем, но я не смог их использовать для решения моей проблемы. Я близка, может быть, всего на шаг или два от решения.Как объединить несколько строк в один в SQL

У меня есть таблица, в которой я загруженную данные, в который выглядит примерно так:

CustName | Model | Serial | Color | MonthlyCount 
Freds | 123AB | L23456 | BLUE | 987 
Freds | 123AB | L23456 | GREEN | 1127 
Jimmys | 111SS | L11234 | BLUE | 2245 
Erikas | 123AB | L11331 | RED | 12 
Erikas | 123AB | L11331 | BLUE | 10 
Erikas | 123AB | L11331 | GREEN | 19 

То, что я хочу, чтобы объединить их в одну строку:

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

Серийные номера являются уникальными поэтому я попытался включить Inner Join T1 в T2 и T1 в T3, используя T1.Serial = T2.Serial и T1.Serial = T3.Serial, но я все еще получаю строки с NULLS, например, Erikas возвращает 5 строк, только один из которых имеет все данные в нем

Я попытался с помощью Где «T1.MonthlyCount» (и т.д.) НЕ 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 

Я ищите только 3 строки, отмеченные как Ожидаемые. Будем очень благодарны любой помощи.

+0

Многие проблемы с вашей текущей попыткой. Тем не менее, я бы сначала посоветовал вам google «SQL PIVOT». –

ответ

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'' ;-) –

+0

Результаты точно такие же, как я опубликовал выше. – user2233506

+0

@ user2233506 это группы запросов 'CustName, Model, Serial', что означает, что они не будут повторяться, как в результатах выше – FuzzyTree

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

Результаты точно такие же, как и выше. Заставляя меня добавлять Color to Group By. – user2233506

+0

@ пользователь2233506. , , Этот запрос будет производить только одну строку для каждого имени, модели и серийного номера. Ваши результаты (по крайней мере, в конце вопроса) повторяют эти значения по строкам. Я не думаю, что это дает одинаковые результаты. –

+0

Это заставляет меня добавлять цвет в группу. По моему мнению, это причина, по которой это делается. – user2233506

Смежные вопросы