Wednesday, March 9, 2011

Query to generate table with all dates between date range

This crazy query basically creates 2 temporarily tables:
1. table with all dates between date range
2. table with data we want

These 2 table are then joined to give the number of requests made group by day.

here it goes...

SELECT CONVERT(varchar(10), derivedtbl_1.date, 101) AS date,
derivedtbl_2.count

FROM (SELECT DISTINCT TOP (100) PERCENT DATEADD(dd, Days.Row, DATEADD(mm, Months.Row, DATEADD(yy, Years.Row, @startDate))) AS date
FROM (SELECT 0 AS Row
UNION ALL
SELECT 1 AS Expr1
UNION ALL
SELECT 2 AS Expr1
UNION ALL
SELECT 3 AS Expr1
UNION ALL
SELECT 4 AS Expr1
UNION ALL
SELECT 5 AS Expr1
UNION ALL
SELECT 6 AS Expr1
UNION ALL
SELECT 7 AS Expr1
UNION ALL
SELECT 8 AS Expr1
UNION ALL
SELECT 9 AS Expr1
UNION ALL
SELECT 10 AS Expr1
UNION ALL
SELECT 11 AS Expr1
UNION ALL
SELECT 12 AS Expr1
UNION ALL
SELECT 13 AS Expr1
UNION ALL
SELECT 14 AS Expr1
UNION ALL
SELECT 15 AS Expr1
UNION ALL
SELECT 16 AS Expr1
UNION ALL
SELECT 17 AS Expr1
UNION ALL
SELECT 18 AS Expr1
UNION ALL
SELECT 19 AS Expr1
UNION ALL
SELECT 20 AS Expr1) AS Years INNER JOIN
(SELECT 0 AS Row
UNION ALL
SELECT 1 AS Expr1
UNION ALL
SELECT 2 AS Expr1
UNION ALL
SELECT 3 AS Expr1
UNION ALL
SELECT 4 AS Expr1
UNION ALL
SELECT 5 AS Expr1
UNION ALL
SELECT 6 AS Expr1
UNION ALL
SELECT 7 AS Expr1
UNION ALL
SELECT 8 AS Expr1
UNION ALL
SELECT 9 AS Expr1
UNION ALL
SELECT 10 AS Expr1
UNION ALL
SELECT 11 AS Expr1) AS Months ON DATEADD(mm, Months.Row, DATEADD(yy, Years.Row, @startDate)) <= @endDate INNER JOIN
(SELECT 0 AS Row
UNION ALL
SELECT 1 AS Expr1
UNION ALL
SELECT 2 AS Expr1
UNION ALL
SELECT 3 AS Expr1
UNION ALL
SELECT 4 AS Expr1
UNION ALL
SELECT 5 AS Expr1
UNION ALL
SELECT 6 AS Expr1
UNION ALL
SELECT 7 AS Expr1
UNION ALL
SELECT 8 AS Expr1
UNION ALL
SELECT 9 AS Expr1
UNION ALL
SELECT 10 AS Expr1
UNION ALL
SELECT 11 AS Expr1
UNION ALL
SELECT 12 AS Expr1
UNION ALL
SELECT 13 AS Expr1
UNION ALL
SELECT 14 AS Expr1
UNION ALL
SELECT 15 AS Expr1
UNION ALL
SELECT 16 AS Expr1
UNION ALL
SELECT 17 AS Expr1
UNION ALL
SELECT 18 AS Expr1
UNION ALL
SELECT 19 AS Expr1
UNION ALL
SELECT 20 AS Expr1
UNION ALL
SELECT 21 AS Expr1
UNION ALL
SELECT 22 AS Expr1
UNION ALL
SELECT 23 AS Expr1
UNION ALL
SELECT 24 AS Expr1
UNION ALL
SELECT 25 AS Expr1
UNION ALL
SELECT 26 AS Expr1
UNION ALL
SELECT 27 AS Expr1
UNION ALL
SELECT 28 AS Expr1
UNION ALL
SELECT 29 AS Expr1
UNION ALL
SELECT 30 AS Expr1) AS Days
ON DATEADD(dd, Days.Row, DATEADD(mm, Months.Row, DATEADD(yy, Years.Row, @startDate))) <= @endDate
WHERE (DATEADD(yy, Years.Row, @startDate) <= @endDate)
ORDER BY date) AS derivedtbl_1

LEFT OUTER JOIN

(SELECT COUNT(*) AS count, CONVERT(varchar(10), b.DateRequested, 101) AS date

FROM [TDBK-SQLDA-CX13.P-TDBFG.COM\CX13].[IS].dbo.T_Team101_Request_Assistance_Group a INNER JOIN
[TDBK-SQLDA-CX13.P-TDBFG.COM\CX13].[IS].dbo.T_Team101_Request_Assistance b ON a.RequestID = b.id INNER JOIN
[TDBK-SQLDA-CX13.P-TDBFG.COM\CX13].[IS].dbo.T_C_Team101_Groups c ON a.Team101ID = c.id

WHERE (b.DateRequested <= DATEADD(day, 1, @endDate)) AND
(b.DateRequested >= @startDate) AND
(c.GroupName = @group)

GROUP BY b.DateRequested) AS derivedtbl_2

ON CONVERT(varchar(10), derivedtbl_1.date, 101) = CONVERT(varchar(10), derivedtbl_2.date, 101)

No comments:

Post a Comment