2016-05-13 23 views
1

Ich bin auf der Suche nach einem Weg zu zusammenfassen Werte mit dynamischen Gruppierungsbedingungen in nur einer Abfrage, wenn möglich. Das bedeutet auch keineUNION ALL. (Die Abfrage unten ist ganz einfach und UNION ALL würde überhaupt nicht teuer sein, aber wenn die Quelldaten aus einer Reihe von Tabellen gesammelt werden muss, nimmt es Performace alle verbinden zweimal zu tun.)Summiere Werte mit dynamischen Gruppierungsbedingungen

Beispieldaten:

create table data (id int, location nvarchar(1), qty int, grouping tinyint) 

insert into data (id, location, qty, grouping) values (1, 'A', 10, 0) 
insert into data (id, location, qty, grouping) values (1, 'A', 20, 0) 
insert into data (id, location, qty, grouping) values (1, 'B', 15, 0) 
insert into data (id, location, qty, grouping) values (2, 'A', 5, 1) 
insert into data (id, location, qty, grouping) values (2, 'B', 10, 1) 
insert into data (id, location, qty, grouping) values (3, 'B', 20, 1) 

Menge soll pro Standort zusammengefasst werden, wenn Gruppierung 0, sonst pro-ID.

Geschätztes Ergebnis:

1, A, 30 
1, B, 15 
2, null, 15 
3, null, 20 

Siehe SQL-Fiddle

Antwort

0

Es ist möglich, mit CASE WHEN ...

SELECT id , 
     (CASE WHEN grouping = 0 THEN location ELSE NULL END) AS location, 
     SUM(qty) AS qty 
FROM data 
GROUP BY id ,(CASE WHEN grouping = 0 THEN location ELSE NULL END) 
ORDER BY id 

Ergebnis:

id location qty 
1 A   30 
1 B   15 
2 NULL  15 
3 NULL  20 
Verwandte Themen