运行 总计(按交易日期和产品 ID)

Running Total by Transaction Date & ProductID

使用 MSSQL17,这是我正在进行的一项探索性工作,按产品和服务查看销售额,运行 一个月的总计。

尝试弄清楚如何有一个查询,在这种情况下按日期和产品 ID 对我的交易 table 中的产品求和,以重新创建如下内容:

-------------------
Date            | ProductID | Sale Price |  Cumulative_Amount   | 
'2018-09-12'            1           1          1
'2018-09-12'            2           2          2
'2018-09-13'            1           1          2
'2018-09-13'            2           2          4    

目前,我似乎已经完善了累计金额只有一个大总数的艺术,但似乎无法弄清楚如何让每个产品都如此重置。产品和服务成本可能会发生变化,不会像上面那样始终保持不变。

我可以手动操作和查看 excel 等,但很想知道这在 SQL 中是如何实现的,以节省我将来的时间,任何提示或指示都会非常有用赞赏。

目前我有以下内容:

SELECT
    [TransactionDate],
    [ProductID],
    [SalePrice],
    SUM (ActualSale) over (order by [TransactionDate],[ProductID] rows unbounded preceding) as Cumulative_Amount,    
FROM tTransactions
    WHERE [TransactionDate] BETWEEN '2018-09-10' AND '2018-09-15'

提前谢谢你。

你需要partition by:

SELECT . . . ,
       SUM(ActualSale) OVER (PARTITION BY ProductId
                             ORDER BY TransactionDate
                            ) as Cumulative_Amount,
FROM tTransactions
WHERE TransactionDate BETWEEN '2018-09-10' AND '2018-09-15';

请注意,不需要 windowing 子句。不存在时默认为 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。如果您有重复的日期,这可能会有点误导。如果这是一个问题,那么您可以明确包含 window 框架:

SELECT . . . ,
       SUM(ActualSale) OVER (PARTITION BY ProductId
                             ORDER BY TransactionDate
                             ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
                            ) as Cumulative_Amount,
FROM tTransactions
WHERE TransactionDate BETWEEN '2018-09-10' AND '2018-09-15';