-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的窗口函数,以及他关于该主题的优秀书籍.
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |