CREATE TABLE [#a]( [id] [int] NOT NULL, [recorddate] [date] NULL, [myvalue] [int] NULL,) ON [PRIMARY]GOINSERT INTO [#a] (id, [recorddate], [myvalue])SELECT 1,'2012-01-02',10 UNION ALLSELECT 2,'2012-01-13',20 UNION ALLSELECT 3,'2012-02-02',30 UNION ALLSELECT 4,'2012-02-24',40 UNION ALLSELECT 5,'2012-08-02',50 UNION ALLSELECT 6,'2012-12-01',60 UNION ALLSELECT 7,'2012-12-28',70
CREATE TABLE [#a]( [id] [int] NOT NULL, [recorddate] [date] NULL, [myvalue] [int] NULL,) ON [PRIMARY]GOINSERT INTO [#a] (id, [recorddate], [myvalue])SELECT 1,'2012-01-02',10 UNION ALLSELECT 2,'2012-01-13',20 UNION ALLSELECT 3,'2012-02-02',30 UNION ALLSELECT 4,'2012-02-24',40 UNION ALLSELECT 5,'2012-08-02',50 UNION ALLSELECT 6,'2012-12-01',60 UNION ALLSELECT 7,'2012-12-28',70WITH myCTE (c)AS( SELECT CAST(CAST(YEAR(GETDATE()) AS CHAR(4))+'-1-1' AS DATE) AS c UNION ALL SELECT CAST(CAST(YEAR(GETDATE()) AS CHAR(4))+'-2-1' AS DATE) AS c UNION ALL SELECT CAST(CAST(YEAR(GETDATE()) AS CHAR(4))+'-3-1' AS DATE) AS c UNION ALL SELECT CAST(CAST(YEAR(GETDATE()) AS CHAR(4))+'-4-1' AS DATE) AS c UNION ALL SELECT CAST(CAST(YEAR(GETDATE()) AS CHAR(4))+'-5-1' AS DATE) AS c UNION ALL SELECT CAST(CAST(YEAR(GETDATE()) AS CHAR(4))+'-6-1' AS DATE) AS c UNION ALL SELECT CAST(CAST(YEAR(GETDATE()) AS CHAR(4))+'-7-1' AS DATE) AS c UNION ALL SELECT CAST(CAST(YEAR(GETDATE()) AS CHAR(4))+'-8-1' AS DATE) AS c UNION ALL SELECT CAST(CAST(YEAR(GETDATE()) AS CHAR(4))+'-9-1' AS DATE) AS c UNION ALL SELECT CAST(CAST(YEAR(GETDATE()) AS CHAR(4))+'-10-1' AS DATE) AS c UNION ALL SELECT CAST(CAST(YEAR(GETDATE()) AS CHAR(4))+'-11-1' AS DATE) AS c UNION ALL SELECT CAST(CAST(YEAR(GETDATE()) AS CHAR(4))+'-12-1' AS DATE) AS c)SELECT DISTINCT c, SUM(myvalue) FROM myCTE LEFT JOIN #a ON myCTE.c=#a.CAST(YEAR(#a.recorddate) as CHAR(4))+'-'+CAST(MONTH(#a.recorddate) as CHAR(2))+'-'+'01' GROUP BY cDROP TABLE #a
WITH CTE(N) AS (SELECT 1 FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))a(N)),CTE2(N) AS (SELECT 1 FROM CTE x CROSS JOIN CTE y),CTE3(N) AS (SELECT 1 FROM CTE2 x CROSS JOIN CTE2 y),CTE4(N) AS (SELECT 1 FROM CTE3 x CROSS JOIN CTE3 y),CTE5(N) AS (SELECT 1 FROM CTE4 x CROSS JOIN CTE4 y),CTE6(N) AS (SELECT 0 UNION ALL SELECT TOP 97199 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM CTE5),TALLY(N) AS (SELECT DATEADD(month, N, 0) FROM CTE6)SELECT a.N AS recorddate, ISNULL(b.myValue,0) AS myValueFROM TALLY aOUTER APPLY (SELECT DATEADD(month, DATEDIFF(month, 0, [recorddate]), 0), SUM([myvalue]) FROM [#a] c WHERE DATEADD(month, DATEDIFF(month, 0, [recorddate]), 0) = a.N GROUP BY DATEADD(month, DATEDIFF(month, 0, [recorddate]), 0) ) b(recorddate,myValue)CROSS APPLY (SELECT MIN(DATEADD(month, DATEDIFF(month, 0, [recorddate]), 0)), MAX(DATEADD(month, DATEDIFF(month, 0, [recorddate]), 0)) FROM [#a]) d(minDate,maxDate)WHERE a.N >= d.minDate AND a.N <= d.maxDate;
WITH CTE(N) AS (SELECT 1 FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) a(N)),CTE2(N) AS (SELECT 1 FROM CTE x CROSS JOIN CTE y),CTE3(N) AS (SELECT 1 FROM CTE2 x CROSS JOIN CTE2 y),CTE4(N) AS (SELECT 1 FROM CTE3 x CROSS JOIN CTE3 y),CTE5(N) AS (SELECT 1 FROM CTE4 x CROSS JOIN CTE4 y),CTE6(N) AS (SELECT 0 UNION ALL SELECT TOP 97199 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM CTE5),TALLY(N) AS (SELECT DATEADD(month, N, 0) FROM CTE6)SELECT a.N AS recorddate, ISNULL(b.myValue,0) AS myValueFROM TALLY aOUTER APPLY (SELECT DATEADD(month, DATEDIFF(month, 0, f.recorddate), 0), SUM(e.numvalue) FROM admin_tasks as e INNER JOIN admin_tasks as f ON e.id=f.numvalue WHERE DATEADD(month, DATEDIFF(month, 0, f.recorddate), 0) = a.N AND f.actionid=5 AND f.numtype=1 GROUP BY DATEADD(month, DATEDIFF(month, 0, f.recorddate), 0) ) b(recorddate,myValue)CROSS APPLY (SELECT MIN(DATEADD(month, DATEDIFF(month, 0, h.recorddate), 0)), MAX(DATEADD(month, DATEDIFF(month, 0, h.recorddate), 0)) FROM admin_tasks as g INNER JOIN admin_tasks as h ON g.id=h.numvalue WHERE h.actionid=5 AND h.numtype=1) d(minDate,maxDate)WHERE a.N >= d.minDate AND a.N <= d.maxDateORDER BY recorddate ASC
(11 row(s) affected)Table 'admin_tasks'. Scan count 17, logical reads 8099, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.Table 'Worktable'. Scan count 11, logical reads 28546, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. SQL Server Execution Times: CPU time = 187 ms, elapsed time = 257 ms.SQL Server parse and compile time: CPU time = 0 ms, elapsed time = 0 ms.
SELECT TOP 97199 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM CTE5
CTE6(N) AS (SELECT 0 UNION ALL SELECT TOP 611 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM CTE5),TALLY(N) AS (SELECT DATEADD(month, N, CAST('2000' AS DATETIME)) FROM CTE6)