Я думаю, это может сработать для вас. Во-первых, вот как я определил свою тестовую таблицу и тестовые данные:
declare @stock table (
transId int not null identity(1,1),
[date] date not null, -- use datetime if not using SQL Server 2008
input decimal(7,2) null,
[output] decimal(7,2) null
);
insert into @stock values
('1/23/2011', 12.22, null),
('1/23/2011', null, 2.22),
('1/24/2011', 16, null),
('1/24/2011', 3.76, null),
('1/24/2011', null, 5.50);
А вот выбор, который я использовал для получения результатов, указанных вами в вашем вопросе. Запрос производит итоговую сумму для всех транзакций в порядке идентификатора транзакции за данный день. Если вы хотите рассчитать общее количество за несколько дней, закомментируйте строку AND b.[date] = a.[date]
.
select
[date],
input = isnull(input,0),
[output] = isnull([output],0),
balance = (isnull(input,0)-isnull([output],0)) +
isnull((
select
sum((isnull(input,0)-isnull([output],0)))
from @stock b
where b.transId < a.transId
and b.[date] = a.[date] -- comment this for totals over multiple dates
),0)
from @stock a
order by transId;
Этот запрос дает:
date input output balance
2011-01-23 12.22 0.00 12.22
2011-01-23 0.00 2.22 10.00
2011-01-24 16.00 0.00 16.00
2011-01-24 3.76 0.00 19.76
2011-01-24 0.00 5.50 14.26
В качестве сноски, поскольку значение промежуточного итога всегда будет одинаковым для каждой транзакции, я бы порекомендовал добавить столбец сальдо в вашу таблицу и рассчитать значение столбца сальдо при вставке строки транзакции. Таким образом, вам нужно будет только посмотреть баланс последней транзакции, чтобы определить, каким должен быть баланс для вставляемой транзакции.