У меня есть одна таблица, включая счета и их баланс.Я хотел бы сообщить баланс за каждый день, а за пропущенные дни - последний день.Таблица счетов:
AccountName Date Balance
thomas 2008-10-09 1000
thomas 2008-10-20 5000
david 2008-02-18 2000
david 2008-03-10 200000
Допустим, нам нужен отчет за 2018-10 гг. Мне нужно получить что-то вроде этого
thomas 2008-10-01 0
...
thomas 2008-10-09 1000
thomas 2008-10-10 1000
...
thomas 2008-10-20 5000
...
thomas 2008-10-31 5000
Я зашел так далеко:
DECLARE @StartDate datetime = '2008/10/9';
DECLARE @EndDate datetime = '2008/10/20';
WITH theDates AS
(
SELECT @StartDate as theDate
UNION ALL
SELECT DATEADD(day, 1, theDate)
FROM theDates
WHERE DATEADD(day, 1, theDate) <= @EndDate
)
select * from accounts a
right outer join thedates d on a.date=d.theDate
order by thedate
Результаты:
AccountNo Date Balance theDate
----------- ---------- -------- ----------
thomas 2008-10-09 1000 2008-10-09
NULL NULL NULL 2008-10-10
NULL NULL NULL 2008-10-11
NULL NULL NULL 2008-10-12
NULL NULL NULL 2008-10-13
NULL NULL NULL 2008-10-14
NULL NULL NULL 2008-10-15
NULL NULL NULL 2008-10-16
NULL NULL NULL 2008-10-17
NULL NULL NULL 2008-10-18
NULL NULL NULL 2008-10-19
thomas 2008-10-20 5000 2008-10-20
Есть идеи?
Обновление: В итоге я использую курсор.Эта версия отлично работает, включая ситуацию, когда учетная запись не имеет записи.
DECLARE @Date datetime
declare @result table (accountname nvarchar(50), balance int, date datetime)
DECLARE @StartDate datetime = '2008/10/1';
DECLARE @EndDate datetime = '2008/10/29';
declare cur cursor for
WITH theDates AS
(
SELECT @StartDate as theDate
UNION ALL
SELECT DATEADD(day, 1, theDate)
FROM theDates
WHERE DATEADD(day, 1, theDate) <= @EndDate
)
select * from theDates
open cur
fetch next from cur into @date
while @@FETCH_STATUS=0
begin
insert into @result
select b.accountName, isnull(balance,
(select isnull((select top 1 balance from accounts where date<@date and accountName=b.accountName order by date desc),0))
), @date from
(select * from accounts where date = @date) a
right outer join (select distinct(accountname) from accounts ) b on a.accountname = b.accountname
fetch next from cur into @date
end
close cur
deallocate cur
select * from @result