2010-12-13 36 views
1

我有一個客戶表和表的OrderDetail的 客戶ID是在表的OrderDetail一個foriegn鍵(我這裏簡化)幫助與SQL - 的GroupBy和多聚集

的的OrderDetail表包含以下幾列 的OrderId 項目Id 客戶ID 尺寸

大小列可以採取LR 2.的md 3. SM下列值 1的任何一個

所以的OrderDetail表可能有以下記錄(我逗號分隔列)

的OrderId項目Id客戶編號尺寸

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 

我想是一個非常有效的查詢(有上百萬條記錄在訂單的詳細信息表),其具有用於給定的客戶ID下面的輸出(30在這種情況下)

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

我使用用途通過查詢3組(每一個用於「LR」的查詢,「MD」和「sm」),並因此掃描表3次。

我正在尋找一個解決方案,掃描表剛剛就職。我認爲解決方案是在MSSQL 2008中使用新的分組集功能。但無論哪種方式,如果我希望有人能幫助我,那麼使用一次掃描就是一種解決方案。

編輯

實際輸出需要有從客戶表中的其他領域和Order Details表也是如此。這些其他字段不依賴於聚合。

例如

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

它會很好,如果我能得到總計爲每個尺寸列以及

+0

是依賴於大小的訂單詳細信息表中的其他列。如果不是,請加上如何展示它們。 – 2010-12-13 12:13:45

+0

我已更新問題以包含此信息。對不起,第一次更清晰。 – 2010-12-13 14:10:24

回答

1

如何:

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

我應該在原始文章中提到我需要來自customer和orderdetails表的非聚合的其他字段。那麼我將如何包括這些領域呢? – 2010-12-13 12:00:13

+0

是的,你也應該添加你需要的實際輸出,所以人們可以給你一個答案 – Lamak 2010-12-13 13:57:12

+0

我將這個標記爲答案,因爲它確實回答了最初陳述的問題。 – 2010-12-13 21:12:24

1

試試這個:

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;  

如果我temName依賴於ItemId,因此您可以執行此操作:

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;