繁体   English   中英

聚合功能按多列分组

[英]Aggregate function in group by multiple columns

我有一个包含以下各列的表:ClientID,OrderID,ProductID,数量,每个ProductID每个OrderID仅出现一次,并且每个OrderID仅对应一个ClientID。

样本数据:

ClientID  OrderID  ProductID  Quantity
1         100      25         10
1         100      30         20
1         101      27         10
1         101      30         10
1         102      27         30
2         103      27         10
2         104      15         10

我需要执行以下操作:在按ClientID和ProductID分组时,我需要为其他列应用聚合函数,以便结果集包含每个ClientID最低的OrderID和每个ClientID每个ProductID的Quantity列的总和。 结果集的行数等于每个ClientID的不同ProductID的数量,并且每一行的OrderID =每个ClientID的最低OrderID,而与ProductID无关。

所需结果:

ClientID  OrderID  ProductID  Quantity
1         100      25         10
1         100      30         30
1         100      27         40
2         103      27         10
2         103      15         10

我尝试使用以下查询实现此目的:

select ClientID, min(OrderID) as OrderID, ProductID, sum(Quantity) as Quantity 
from table
group by ClientID, ProductID

但是由于分组的原因,结果集每个ClientID包含多个OrderID:

当前结果:

ClientID  OrderID  ProductID  Quantity
1         100      25         10
1         100      30         30
1         101      27         40
2         103      27         10
2         104      15         10

请注意,第三和第四行的OrderID在两个结果之间是如何不同的。

select 
    ClientID, MinOrderID, ProductID, SUM(quantity)
from
(
    select ClientID, min(OrderID) over (partition by ClientID) as MinOrderID, ProductID, Quantity 
    from yourtable
) v
group by ClientID, MinOrderID, ProductID

或者

select distinct 
    ClientID, 
    min(OrderID) over (partition by ClientID),
    ProductID,
    sum(Quantity) over (partition by ClientID, ProductID)       
from yourtable
create table dbo.aatest
(
    ClientID int not null,
    OrderID int not Null,
    ProductID int not null,
    Quantity int not null
);

insert into dbo.aatest values (1,100,25,10)
insert into dbo.aatest values (1,100,30,20)
insert into dbo.aatest values (1,101,27,10)
insert into dbo.aatest values (1,101,30,10)
insert into dbo.aatest values (1,102,27,30)
insert into dbo.aatest values (2,103,27,10)
insert into dbo.aatest values (2,104,15,10)

select * from dbo.aatest;

select
    T.ClientID,
    M.OrderID,
    ProductID,
    TotalQuantity = SUM(Quantity)
from
    (select 
        ClientID,
        OrderID = MIN(OrderID)
    from
        dbo.aatest
    group by
        ClientID) as M
    join dbo.aatest as T
        on M.ClientID = T.ClientID
group by
    T.ClientID,
    M.OrderID,
    ProductID
order by
    ClientID,
    ProductID

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM