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 有何不同。
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)