【问题标题】:Help with SQL - GroupBy and multiple aggregatesSQL 帮助 - GroupBy 和多个聚合
【发布时间】:2010-12-13 11:24:44
【问题描述】:

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

orderdetail 表包含以下列 订单编号 项目 ID 客户ID 尺寸

“大小”列可以采用以下任一值 1.lr 2.MD 3.sm

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

OrderId ItemId CustomerId 大小

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

我想要的是一个非常有效的查询(订单详细信息表中有数百万条记录),对于给定的 customerId(在本例中为 30)具有以下输出

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

我使用的查询使用 3 个分组查询(“lr”、“md”和“sm”各一个),因此它扫描表 3 次。

我正在寻找一种只扫描表一次的解决方案。我认为解决方案是使用 MSSQL 2008 中的新分组集功能。但无论哪种方式,如果我希望有人可以帮助我,则使用一次扫描的解决方案。

编辑

实际输出还需要客户表和订单明细表中的其他字段。这些其他字段不依赖于聚合。

例如

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

如果我也能得到每个 Size 列的总数,那就太好了

【问题讨论】:

  • 是订单详细信息表中的其他列,取决于大小。如果没有,请说明如何显示它们。
  • 我已更新问题以包含此信息。很抱歉第一次没有说清楚。

标签: tsql sql-server-2008 grouping


【解决方案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

【讨论】:

  • 我应该在原始帖子中提到,我需要来自 customer 和 orderdetails 表的其他字段,这些字段不是聚合的。那么我将如何包含这些字段呢?
  • 是的,您还应该添加您需要的实际输出,以便人们可以给您答案
  • 我会将其标记为答案,因为它确实回答了最初陈述的问题。
【解决方案2】:

试试这个:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 2020-11-05
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2020-11-17
    • 2022-01-01
    相关资源
    最近更新 更多