Tsql SQL-GroupBy和多个聚合的帮助

Tsql SQL-GroupBy和多个聚合的帮助,tsql,sql-server-2008,grouping,Tsql,Sql Server 2008,Grouping,我有一个customer表和一个orderdetail表 客户id是orderdetail表中的外键(我在这里简化) orderdetail表包含以下列 医嘱ID 项目ID 客户ID 大小 “大小”列可以采用以下任一值 1.lr 2.医学博士 3.山猫 因此orderdetail表可能有以下记录(我用逗号分隔了列) OrderId项目ID客户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

我有一个customer表和一个orderdetail表 客户id是orderdetail表中的外键(我在这里简化)

orderdetail表包含以下列 医嘱ID 项目ID 客户ID 大小

“大小”列可以采用以下任一值 1.lr 2.医学博士 3.山猫

因此orderdetail表可能有以下记录(我用逗号分隔了列)

OrderId项目ID客户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
我想要的是一个真正高效的查询(order details表中有数百万条记录),对于给定的customerId(本例中为30条)具有以下输出

我使用的查询使用3个group by查询(分别表示“lr”、“md”和“sm”),因此它会扫描表3次

我正在寻找一种只扫描一次表的解决方案。我认为解决方案是在MSSQL 2008中使用新的分组集功能。但不管怎样,如果我希望有人能帮助我的话,一次扫描就可以解决问题

编辑

实际输出还需要customer表和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
如果我也能得到每个尺寸列的总数,那就太好了

这个怎么样:

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
试试这个:

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;    
如果ItemName依赖于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;

我应该在原始帖子中提到,我需要customer和orderdetails表中的其他字段,这些字段不是聚合字段。那么,我应该如何包括这些字段呢?是的,您还应该添加您需要的实际输出,以便人们可以给您答案。我将此标记为答案,因为它确实回答了最初所述的问题。订单详细信息表中的其他列是否取决于大小。如果没有,请说明如何显示。我已更新问题以包含此信息。对不起,第一次说得不清楚。
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;