Mit første forslag ville være at bruge din kalendertabel, hvis du ikke har en, så opret en. De er meget nyttige. Din forespørgsel er så simpel som:
DECLARE @MinDate DATE = '20140101',
@MaxDate DATE = '20140106';
SELECT Date
FROM dbo.Calendar
WHERE Date >= @MinDate
AND Date < @MaxDate;
Hvis du ikke vil eller ikke kan oprette en kalendertabel, kan du stadig gøre dette på et øjeblik uden en rekursiv 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;
For yderligere læsning om dette se:
- Generer et sæt eller en sekvens uden loops – del 1
- Generer et sæt eller en sekvens uden loops – del 2
- Generer et sæt eller en sekvens uden loops – del 3
Med hensyn til så at bruge denne sekvens af datoer i en markør, vil jeg virkelig anbefale dig at finde en anden måde. Der er normalt et sæt baseret alternativ, der vil yde meget bedre.
Så med dine data:
date | it_cd | qty
24-04-14 | i-1 | 10
26-04-14 | i-1 | 20
For at få mængden den 28-04-2014 (som jeg forstår er dit krav), behøver du faktisk ikke noget af ovenstående, du kan blot bruge:
SELECT TOP 1 date, it_cd, qty
FROM T
WHERE it_cd = 'i-1'
AND Date <= '20140428'
ORDER BY Date DESC;
Hvis du ikke vil have det til en bestemt vare:
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;