Your description does not match your example: you state that "If datediff startdate and enddate = 5 then columns rb1-rb6 are populated", but your example has a datediff of 9 and yet only columns rb1-rb9 are populated.Assuming the first of these is correct (i.e. the period startdate-enddate is inclusive), rather than the second, and that SET DATEFIRST is at its default setting of Sunday (SET DATEFIRST 7), and Numbers is a zero-based tally table that goes up to at least 15...The test setup:DROP TABLE DoozyCREATE TABLE Doozy ( id int PRIMARY KEY, rb1 int NOT NULL, rb2 int NOT NULL, rb3 int NOT NULL, rb4 int NOT NULL, rb5 int NOT NULL, rb6 int NOT NULL, rb7 int NOT NULL, rb8 int NOT NULL, rb9 int NOT NULL, rb10 int NOT NULL, rb11 int NOT NULL, rb12 int NOT NULL, rb13 int NOT NULL, rb14 int NOT NULL, rb15 int NOT NULL, rb16 int NOT NULL, startdate datetime NOT NULL, enddate datetime NOT NULL)INSERT INTO Doozy VALUES (100, 5, 2, 2, 6, 8, 3, 4, 7, 9, 0, 0, 0, 0, 0, 0, 0, '2003-01-01', '2003-01-10')INSERT INTO Doozy VALUES (101, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '2003-02-01', '2003-02-01')INSERT INTO Doozy VALUES (102, 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8, '2003-03-01', '2003-03-15')
The query:SELECT SUM(CASE WHEN dw = 1 THEN total ELSE 0 END) AS S, SUM(CASE WHEN dw = 2 THEN total ELSE 0 END) AS M, SUM(CASE WHEN dw = 3 THEN total ELSE 0 END) AS T, SUM(CASE WHEN dw = 4 THEN total ELSE 0 END) AS W, SUM(CASE WHEN dw = 5 THEN total ELSE 0 END) AS T, SUM(CASE WHEN dw = 6 THEN total ELSE 0 END) AS F, SUM(CASE WHEN dw = 7 THEN total ELSE 0 END) AS SFROM ( SELECT DATEPART(dw, dt) AS dw, SUM(rb) AS total FROM ( SELECT DATEADD(d, n, startdate) AS dt, CASE n+1 WHEN 1 THEN rb1 WHEN 2 THEN rb2 WHEN 3 THEN rb3 WHEN 4 THEN rb4 WHEN 5 THEN rb5 WHEN 6 THEN rb6 WHEN 7 THEN rb7 WHEN 8 THEN rb8 WHEN 9 THEN rb9 WHEN 10 THEN rb10 WHEN 11 THEN rb11 WHEN 12 THEN rb12 WHEN 13 THEN rb13 WHEN 14 THEN rb14 WHEN 15 THEN rb15 WHEN 16 THEN rb16 END AS rb FROM Doozy INNER JOIN Numbers ON n BETWEEN 0 AND DATEDIFF(d, startdate, enddate) ) AS A GROUP BY DATEPART(dw, dt) ) AS A
Actually, it's probably worth taking out the intermediate grouping by day of week since it's not necessary:SELECT SUM(CASE WHEN dw = 1 THEN rb ELSE 0 END) AS S, SUM(CASE WHEN dw = 2 THEN rb ELSE 0 END) AS M, SUM(CASE WHEN dw = 3 THEN rb ELSE 0 END) AS T, SUM(CASE WHEN dw = 4 THEN rb ELSE 0 END) AS W, SUM(CASE WHEN dw = 5 THEN rb ELSE 0 END) AS T, SUM(CASE WHEN dw = 6 THEN rb ELSE 0 END) AS F, SUM(CASE WHEN dw = 7 THEN rb ELSE 0 END) AS SFROM ( SELECT DATEPART(dw, DATEADD(d, n, startdate)) AS dw, CASE n+1 WHEN 1 THEN rb1 WHEN 2 THEN rb2 WHEN 3 THEN rb3 WHEN 4 THEN rb4 WHEN 5 THEN rb5 WHEN 6 THEN rb6 WHEN 7 THEN rb7 WHEN 8 THEN rb8 WHEN 9 THEN rb9 WHEN 10 THEN rb10 WHEN 11 THEN rb11 WHEN 12 THEN rb12 WHEN 13 THEN rb13 WHEN 14 THEN rb14 WHEN 15 THEN rb15 WHEN 16 THEN rb16 END AS rb FROM Doozy INNER JOIN Numbers ON n BETWEEN 0 AND DATEDIFF(d, startdate, enddate) ) AS A
Edited by - Arnold Fribble on 02/27/2003 09:48:24