То, что вам нужно, называется агрегатной оконной функцией , в частности 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;
Демонстрация: дБ <> скрипка
Использование ROWS UNBOUNDED PRECEDING
в рамке окна является сокращением для ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
. Поведение ROWS
отличается от w.r.t дубликатов (и, как правило, с лучшими показателями ), чем значение по умолчанию RANGE
. Есть веские аргументы, чтобы сказать, что ROWS
должно было быть по умолчанию, но это не то, что нам дали ?.
Для получения дополнительной информации см. Как использовать оконные функции Microsoft SQL Server 2012 от Ицик Бен-Гана и его превосходную книгу по теме.