Maciej Los
Другой способ достичь этого-использовать: ВЕСТИ[^] и-или ЗАДЕРЖКА[^] функция.
Для получения более подробной информации, пожалуйста, смотрите: SQL SERVER - введение в LEAD и LAG-аналитические функции, введенные в SQL Server 2012 - Journey to SQL Authority with Pinal Dave[^]
Примечание: требуется SQL server 2012 и выше!
Как я уже упоминал в комментарии к решению №1 Сувенду Шекхар Гири[^], вы должны самостоятельно объединить таблицы на обоих полях: idno
и tran
как суметь сохранить отношения между idno
и tran
.
Проверьте приведенный ниже пример:
DECLARE @MyTable TABLE(idno VARCHAR(3),[tran] INT, amount INT)
INSERT INTO @MyTable (idno, [tran], amount)
VALUES('001', 1, 200),
('001', 2, 500),
('001', 3, 1000),
('001', 4, 1700),
('002', 1, 100),
('002', 2, 300),
('002', 3, 1500),
('002', 4, 1750)
--1
SELECT a.idno, a.[tran], a.amount, ISNULL(a.amount-b.amount,0) AS bal_difference
FROM @MyTable a
LEFT JOIN @MyTable b ON b.[tran]=a.[tran]-1
--2
SELECT a.idno, a.[tran], a.amount, ISNULL(a.amount-b.amount,0) AS bal_difference
FROM @MyTable a
LEFT JOIN @MyTable b ON a.idno = b.idno AND b.[tran]=a.[tran]-1
Результат №1 -
неправильный результатidno tran amount bal_difference
001 1 200 0
001 2 500 300
001 2 500 400
001 3 1000 500
001 3 1000 700
001 4 1700 700
001 4 1700 200
002 1 100 0
002 2 300 100
002 2 300 200
002 3 1500 1000
002 3 1500 1200
002 4 1750 750
002 4 1750 250
Результат №2 -
правильный результатidno tran amount bal_difference
001 1 200 0
001 2 500 300
001 3 1000 500
001 4 1700 700
002 1 100 0
002 2 300 200
002 3 1500 1200
002 4 1750 250