在查询列中使用购买和销售运行总计

-1 sql-server running-total sql-server-2016

我有一张如下表:

表

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

在此输入图像描述

我正在使用SQL Server 2016.

小智 5

您需要的东西称为聚合窗口函数,具体而言SUM ... OVER.

问题在于,如果您可以确定性地指定行的顺序,那么这样的"运行总计"才有意义.示例数据不包含可用于提供此所需排序的属性.表本身没有明确的顺序.

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

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

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

SELECT
    T.Purchase,
    T.Sale,
    Remaining =
        SUM(ISNULL(T.Purchase, $0) - ISNULL(T.Sale, 0)) OVER (
            ORDER BY T.EntryDate
            ROWS UNBOUNDED PRECEDING)
FROM @T AS T;
Run Code Online (Sandbox Code Playgroud)

演示:db <>小提琴

ROWS UNBOUNDED PRECEDING在窗框中使用是简写ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.与默认值相比,行为ROWS 是不同的(并且通常表现更好)RANGE.有充分的论ROWS据说应该是默认的,但这不是我们给出的.

有关详细信息,请参阅Itzik Ben-Gan的如何使用Microsoft SQL Server 2012的窗口函数,以及他关于该主题的优秀书籍.