Mijn eerste suggestie zou zijn om je kalendertabel te gebruiken, als je er geen hebt, maak er dan een aan. Ze zijn erg handig. Uw vraag is dan zo simpel als:
DECLARE @MinDate DATE = '20140101',
@MaxDate DATE = '20140106';
SELECT Date
FROM dbo.Calendar
WHERE Date >= @MinDate
AND Date < @MaxDate;
Als u geen kalendertabel wilt of kunt maken, kunt u dit nog steeds on-the-fly doen zonder een recursieve CTE:
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;
Zie voor meer informatie hierover:
- Genereer een set of reeks zonder lussen – deel 1
- Genereer een set of reeks zonder lussen – deel 2
- Genereer een set of reeks zonder lussen – deel 3
Wat betreft het gebruik van deze reeks datums in een cursor, zou ik je echt aanraden een andere manier te vinden. Er is meestal een op een set gebaseerd alternatief dat veel beter zal presteren.
Dus met uw gegevens:
date | it_cd | qty
24-04-14 | i-1 | 10
26-04-14 | i-1 | 20
Om de hoeveelheid op 28-04-2014 te krijgen (waarvan ik begrijp dat dit uw vereiste is), heeft u geen van de bovenstaande dingen nodig, u kunt gewoon het volgende gebruiken:
SELECT TOP 1 date, it_cd, qty
FROM T
WHERE it_cd = 'i-1'
AND Date <= '20140428'
ORDER BY Date DESC;
Als je het niet wilt voor een bepaald item:
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;