Saran pertama saya adalah menggunakan tabel kalender Anda, jika Anda tidak memilikinya, buatlah. Mereka sangat berguna. Permintaan Anda sesederhana:
DECLARE @MinDate DATE = '20140101',
@MaxDate DATE = '20140106';
SELECT Date
FROM dbo.Calendar
WHERE Date >= @MinDate
AND Date < @MaxDate;
Jika Anda tidak ingin, atau tidak dapat membuat tabel kalender, Anda masih dapat melakukannya dengan cepat tanpa CTE rekursif:
DECLARE @MinDate DATE = '20140101',
@MaxDate DATE = '20140106';
SELECT TOP (DATEDIFF(DAY, @MinDate, @MaxDate) + 1)
Date = DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY a.object_id) - 1, @MinDate)
FROM sys.all_objects a
CROSS JOIN sys.all_objects b;
Untuk bacaan lebih lanjut tentang ini, lihat:
- Menghasilkan satu set atau urutan tanpa loop – bagian 1
- Menghasilkan satu set atau urutan tanpa loop – bagian 2
- Menghasilkan satu set atau urutan tanpa loop – bagian 3
Berkenaan dengan kemudian menggunakan urutan tanggal ini dalam kursor, saya sangat menyarankan Anda menemukan cara lain. Biasanya ada alternatif berbasis set yang akan berkinerja jauh lebih baik.
Jadi dengan data Anda:
Tanggal date | it_cd | qty
24-04-14 | i-1 | 10
26-04-14 | i-1 | 20
Untuk mendapatkan jumlah pada 28-04-2014 (yang saya kumpulkan adalah kebutuhan Anda), Anda sebenarnya tidak memerlukan hal-hal di atas, Anda cukup menggunakan:
SELECT TOP 1 date, it_cd, qty
FROM T
WHERE it_cd = 'i-1'
AND Date <= '20140428'
ORDER BY Date DESC;
Jika Anda tidak menginginkannya untuk item tertentu:
SELECT date, it_cd, qty
FROM ( SELECT date,
it_cd,
qty,
RowNumber = ROW_NUMBER() OVER(PARTITION BY ic_id
ORDER BY date DESC)
FROM T
WHERE Date <= '20140428'
) T
WHERE RowNumber = 1;