Oto przykład z wykorzystaniem tabeli kalendarza (którą naprawdę powinieneś mieć). Ten przykład przedstawia tylko rok 2014, ale możesz go wypełnić dowolną liczbą lat ...
CREATE TABLE dbo.Calendar(d DATE PRIMARY KEY);
INSERT dbo.Calendar(d) SELECT TOP (365)
DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY number)-1, '20140101')
FROM [master].dbo.spt_values
WHERE [type] = N'P' ORDER BY number;
Teraz zapytanie jest proste:
DECLARE @s DATE = '20140518', @e DATE = '20140527';
SELECT c.d, Frequency = COALESCE(s.Frequency,0)
FROM dbo.Calendar AS c
LEFT OUTER JOIN dbo.splunge AS s
ON c.d = s.[date]
WHERE c.d >= @s
AND c.d < DATEADD(DAY, 1, @e);
Przykład SQLfiddle
Jeśli nie możesz utworzyć tabeli kalendarza (i nie masz pod ręką tabeli liczb), możesz po prostu wstawić ją do tabeli:
DECLARE @s DATE = '20140518', @e DATE = '20140527';
SELECT c.d, Frequency = COALESCE(s.Frequency,0)
FROM
(
SELECT TOP (DATEDIFF(DAY, @s, @e)+1)
DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY number)-1, @s)
FROM [master].dbo.spt_values
WHERE [type] = N'P' ORDER BY number
) AS c(d)
LEFT OUTER JOIN dbo.splunge2 AS s
ON c.d = s.[date]
WHERE c.d >= @s
AND c.d < DATEADD(DAY, 1, @e);
Przykład SQLfiddle
Więcej informacji na temat generowania zestawów (dat, liczb itp.) Można znaleźć w tej serii: