В качестве альтернативы подзапросам вы можете использовать текущий итоговый запрос. Вот как я настроил один для этого случая. Сначала создайте несколько тестовых данных:
create table #payments (
paymentid int identity,
customerid int,
paymentdate datetime,
amount decimal
)
insert into #payments (customerid,paymentdate,amount) values (1,'2009-01-01',1.00)
insert into #payments (customerid,paymentdate,amount) values (1,'2009-01-02',2.00)
insert into #payments (customerid,paymentdate,amount) values (1,'2009-01-03',-1.00)
insert into #payments (customerid,paymentdate,amount) values (1,'2009-01-04',2.00)
insert into #payments (customerid,paymentdate,amount) values (1,'2009-01-05',-3.00)
insert into #payments (customerid,paymentdate,amount) values (2,'2009-01-01',10.00)
insert into #payments (customerid,paymentdate,amount) values (2,'2009-01-02',-5.00)
insert into #payments (customerid,paymentdate,amount) values (2,'2009-01-03',7.00)
Теперь вы можете выполнить запрос промежуточного итога, который вычисляет баланс для каждого клиента после каждого платежа:
select cur.customerid, cur.paymentdate, sum(prev.amount)
from #payments cur
inner join #payments prev
on cur.customerid = prev.customerid
and cur.paymentdate >= prev.paymentdate
group by cur.customerid, cur.paymentdate
Это генерирует данные:
Customer Paymentdate Balance after payment
1 2009.01.01 1
1 2009.01.02 3
1 2009.01.03 2
1 2009.01.04 4
1 2009.01.05 1
2 2009.01.01 10
2 2009.01.02 5
2 2009.01.03 12
Чтобы посмотреть на максимум, вы можете создать группу по текущему итоговому запросу:
select customerid, max(balance)
from (
select cur.customerid, cur.paymentdate, balance = sum(prev.amount)
from #payments cur
inner join #payments prev
on cur.customerid = prev.customerid
and cur.paymentdate >= prev.paymentdate
group by cur.customerid, cur.paymentdate
) runningtotal
group by customerid
Что дает:
Customer Max balance
1 4
2 12
Надеюсь, это полезно.