use*_*574 0 sql t-sql sql-server window-functions
因此,我有一个发货列表,并且有订单总额和每个单独发货的总额,但我正在努力想出代码来为累计发货创建一个附加列,其中包括当前发货,加上该订单之前的所有发货。这是我到目前为止所得到的结果:
| 订单号 | 发货日期 | 合计订单 | 出货总量 | 累计出货量 | 秩 |
|---|---|---|---|---|---|
| 22396 | 2022-04-04 | 639,964 | 2,983 | 639,966 | 3 |
| 22396 | 2022-03-31 | 639,964 | 5,626 | 639,966 | 2 |
| 22396 | 2022-02-24 | 639,964 | 631,355 | 639,966 | 1 |
因此,这是同一订单的 3 次单独发货。第 3 行中的第一次发货是正确的,但我需要第 2 行的累计发货列是两者的发货总和,因此 631,555 美元 + 5,626 美元。按照相同的逻辑,第 1 行应该是所有 3 行的总和,此时将等于订单总额 639,964 美元。看起来是这样的:
| 订单号 | 发货日期 | 合计订单 | 出货总量 | 累计出货量 | 秩 |
|---|---|---|---|---|---|
| 22396 | 2022-04-04 | 639,964 | 2,983 | 639,964 | 3 |
| 22396 | 2022-03-31 | 639,964 | 5,626 | 636,981 | 2 |
| 22396 | 2022-02-24 | 639,964 | 631,355 | 631,355 | 1 |
我假设实现此目的的最佳方法是使用 over(partition by ()),但我正在努力想出代码。这是我到目前为止所拥有的:
SELECT
OrderNo,
ShipDate,
OrderTotal,
[Shipment Total],
SUM([Shipment Total]) OVER(PARTITION BY OrderNo) AS [Cumulative Shipments],
[Rank]
FROM Shipments
WHERE OrderNo = '22396'
Run Code Online (Sandbox Code Playgroud)
[Rank] 列来自早期的 CTE,它根据发货日期计算该货件的排名:
ROW_NUMBER() OVER(PARTITION BY d.OrderNo ORDER BY d.ShipDate) AS [Rank]
Run Code Online (Sandbox Code Playgroud)
我需要类似 SUM([Shipment Total]) 的东西,其中排名等于或小于当前排名。我确信日期列可以完成同样的事情,但只是不确定如何完成查询
您似乎已经完成了一半,只是缺少功能累积总和的排序标准,例如
select *,
Sum(ShipmentTotal)
over(partition by OrderNo
order by ShipDate rows between unbounded preceding and current row)
from Shipments;
Run Code Online (Sandbox Code Playgroud)