2010-12-13 19 views
1

ich einen Kunden Tisch haben und eine Orderdetail-Tabelle die Kunden-ID ist ein foriegn Schlüssel in der Tabelle Orderdetail (Ich bin hier vereinfacht)Hilfe für SQL - GroupBy und mehrere Aggregate

Die Orderdetail-Tabelle enthält die folgenden Spalten OrderId ItemId CustomerId Größe

Die Spalte Größe kann auf einem der folgenden Werte annehmen 1. vl 2. md 3. sm

So könnte die Tabelle Orderdetail die folgenden Datensätze haben (ich habe Komma die Spalten getrennt)

OrderId ItemId CustomerId Größe

1,1,30,lr 
1,1,30,md 
1,1,30,sm 
2,1,30,lr 
2,1,30,md 
3,1,30,lr 
3,1,30,sm 
4,1,30,lr 
5,1,30,md 
6,2,30,sm 
7,3,30,md 
8,3,30,lr 

Was Ich mag würde, ist eine wirklich effiziente Abfrage (es Millionen von Datensätzen ist in den Bestelldaten-Tabellen), die die folgende Ausgabe für eine gegebene customerId (30 in diesem Fall)

ItemId SizeLr SizeMd SizeSm 
1   4  3  2 
2   0  0  1 
3   1  1  0 

die Abfrage ich verwende Verwendungen 3 Gruppe von Abfragen (jeweils eine für „lr“, „md“ hat und "sm") und als Ergebnis scannt es der Tisch 3 mal.

Ich bin auf der Suche nach einer Lösung, die den Tisch nur Onces scannt. Ich denke, dass die Lösung die neue Grouping-Set-Funktion in MSSQL 2008 verwendet. Aber in beiden Fällen, eine Lösung mit einem Scan, wenn ich hoffe, dass jemand mir helfen kann.

EDIT

Die tatsächliche Leistung braucht andere Felder aus der Kundentabelle und die Tabelle Bestelldetails als auch hat. Diese anderen Felder sind nicht von den Aggregaten abhängig.

Zum Beispiel

ItemName ItemId SizeLr SizeMd SizeSm 
    A   1  4  3  2 
    B   2  0  0  1 
    C   3  1  1  0 
    Totals   5  4  4 

Es wäre schön, wenn ich die Summen für jede der Größe Spalten bekommen könnte auch

+0

sind die anderen Spalten aus der Tabelle mit den Auftragsdetails abhängig von Größe. Wenn nicht, bitte spezifizieren Sie, wie sie angezeigt werden. –

+0

Ich habe die Frage aktualisiert, um diese Informationen zu enthalten. Es tut mir leid, dass ich beim ersten Mal nicht klarer geworden bin. –

Antwort

1

Wie wäre es damit:

SELECT ItemId, 
    SUM(CASE WHEN Size = 'Lr' THEN 1 ELSE 0 END) AS SizeLr, 
    SUM(CASE WHEN Size = 'Md' THEN 1 ELSE 0 END) AS SizeMd, 
    SUM(CASE WHEN Size = 'Sm' THEN 1 ELSE 0 END) AS SizeSm 
FROM OrderDetail 
WHERE CustomerId = 30 
GROUP BY ItemId 
+0

Ich hätte im ursprünglichen Beitrag erwähnt werden müssen, dass ich andere Felder aus der Tabelle Kunden und Bestelldetails brauche, die keine Aggregate sind. Also, wie würde ich diese Felder auch einbeziehen? –

+0

Ja, und Sie sollten auch hinzufügen, was ist die tatsächliche Ausgabe, die Sie benötigen, so können die Menschen Ihnen eine Antwort geben – Lamak

+0

Ich werde dies als die Antwort markieren, da es die Frage beantwortet, wie es ursprünglich angegeben wurde. –

1

Versuchen Sie folgendes:

select Itemid, 
    sum (case when Size = 'lr' then 1 else 0 end) SizeLR, 
    sum (case when Size = 'Md' then 1 else 0 end) SizeMd, 
    sum (case when Size = 'SM' then 1 else 0 end) SizeSM 
from orderdetail 
group by Itemid 
order by Itemid;  

Wenn ich temName ist abhängig von ItemId Sie können dies tun:

select Itemname, Itemid, 
    sum (case when Size = 'lr' then 1 else 0 end) SizeLR, 
    sum (case when Size = 'Md' then 1 else 0 end) SizeMd, 
    sum (case when Size = 'SM' then 1 else 0 end) SizeSM 
from orderdetail 
group by Itemid, Itemname 
order by Itemid;