运行 查询列中包含采购和销售的总计

Running total with purchases and sales in query column

我有一个 table 如下所示:

如何使用 Transact-SQL(按日期排序)获得如下所示的列?

我正在使用 SQL Server 2016。

你需要的东西叫做 aggregate windowing function,具体来说 SUM ... OVER

问题是这样的 'running total' 只有在您可以确定地指定行的顺序时才有意义。示例数据不包含可用于提供此必需排序的属性。表格本身没有明确的顺序。

如果您有输入日期列之类的内容,则可以使用如下解决方案:

DECLARE @T table
(
    EntryDate datetime2(0) NOT NULL,
    Purchase money NULL,
    Sale money NULL
);

INSERT @T
    (EntryDate, Purchase, Sale)
VALUES
    ('20180801 13:00:00', 00, NULL),
    ('20180801 14:00:00', NULL, 0),
    ('20180801 15:00:00', NULL, 0),
    ('20180801 16:00:00', 00, NULL);

SELECT
    T.Purchase,
    T.Sale,
    Remaining =
        SUM(ISNULL(T.Purchase, [=10=]) - ISNULL(T.Sale, 0)) OVER (
            ORDER BY T.EntryDate
            ROWS UNBOUNDED PRECEDING)
FROM @T AS T;

演示:db<>fiddle

在 window 框架中使用 ROWS UNBOUNDED PRECEDING 是 shorthand 用于 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWROWS is different w.r.t duplicates (and generally better-performing) 的行为优于默认的 RANGE。有强有力的论据表明 ROWS 应该是默认值,但那不是我们得到的。

有关详细信息,请参阅有关该主题的 How to Use Microsoft SQL Server 2012's Window Functions by Itzik Ben-Gan, and his excellent book