簡體   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