按多列分组的聚合函数

ovi*_*ixb 2 sql sql-server group-by aggregate aggregate-functions

我有一张包含以下列的表:ClientID、OrderID、ProductID、Quantity,每个 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
Run Code Online (Sandbox Code Playgroud)

我需要执行以下操作:在按 ClientID 和 ProductID 分组时,我需要对其他列应用聚合函数,以便结果集包含每个 ClientID 的最低 OrderID 以及每个 ClientID 的每个 ProductID 的数量列的总和。结果集的行数等于每个 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
Run Code Online (Sandbox Code Playgroud)

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

select ClientID, min(OrderID) as OrderID, ProductID, sum(Quantity) as Quantity 
from table
group by ClientID, ProductID
Run Code Online (Sandbox Code Playgroud)

但由于分组,结果集包含每个 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
Run Code Online (Sandbox Code Playgroud)

请注意两个结果中第 3 行和第 4 行的 OrderID 有何不同。

pod*_*ska 5

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
Run Code Online (Sandbox Code Playgroud)

或者替代地

select distinct 
    ClientID, 
    min(OrderID) over (partition by ClientID),
    ProductID,
    sum(Quantity) over (partition by ClientID, ProductID)       
from yourtable
Run Code Online (Sandbox Code Playgroud)