Mi primera sugerencia sería usar su tabla de calendario, si no tiene una, cree una. Son muy útiles. Su consulta es tan simple como:
DECLARE @MinDate DATE = '20140101',
@MaxDate DATE = '20140106';
SELECT Date
FROM dbo.Calendar
WHERE Date >= @MinDate
AND Date < @MaxDate;
Si no quiere o no puede crear una tabla de calendario, aún puede hacerlo sobre la marcha sin un CTE recursivo:
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;
Para leer más sobre esto, consulte:
- Generar un conjunto o secuencia sin bucles:parte 1
- Generar un conjunto o secuencia sin bucles:parte 2
- Generar un conjunto o secuencia sin bucles:parte 3
Con respecto al uso de esta secuencia de fechas en un cursor, realmente recomendaría que busque otra forma. Por lo general, existe una alternativa basada en conjuntos que funcionará mucho mejor.
Así que con tus datos:
date | it_cd | qty
24-04-14 | i-1 | 10
26-04-14 | i-1 | 20
Para obtener la cantidad el 28-04-2014 (que supongo que es su requisito), en realidad no necesita ninguno de los anteriores, simplemente puede usar:
SELECT TOP 1 date, it_cd, qty
FROM T
WHERE it_cd = 'i-1'
AND Date <= '20140428'
ORDER BY Date DESC;
Si no lo quiere para un artículo en particular:
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;