Вставить пропущенные записи при выполнении GROUP BY? - PullRequest
4 голосов
/ 05 августа 2011

Я пытаюсь использовать GROUP BY в моей таблице для группировки записей по неделям. Однако, если на определенной неделе нет записей, как я могу вставить 0 вместо пропущенной записи?

CREATE TABLE #TEMP (startdate datetime)

INSERT INTO #TEMP VALUES('2011-02-01')
INSERT INTO #TEMP VALUES('2011-02-02')
INSERT INTO #TEMP VALUES('2011-02-03')
INSERT INTO #TEMP VALUES('2011-02-04')
INSERT INTO #TEMP VALUES('2011-02-05')
INSERT INTO #TEMP VALUES('2011-02-18')
INSERT INTO #TEMP VALUES('2011-02-19')
INSERT INTO #TEMP VALUES('2011-02-20')
INSERT INTO #TEMP VALUES('2011-02-21')

SELECT DATEPART(YEAR,startdate) AS 'AYear',
       DATEPART(wk,startdate) AS 'AWeek',
       COUNT(*)
FROM #TEMP
GROUP BY DATEPART(YEAR,startdate),DATEPART(wk,startdate)
ORDER BY 1,2

DROP TABLE #TEMP

Я получаю:

AYear   AWeek   (No column name)
2011        6       5
2011        8       2
2011        9       2

но я хочу это:

AYear   AWeek   (No column name)
2011        6       5
2011        7       0
2011        8       2
2011        9       2

Любые предложения о том, как это сделать?

1 Ответ

4 голосов
/ 05 августа 2011

Вы можете создать таблицу со всеми возможными неделями / годами, а затем сделать это:

SELECT fw.Year AS 'AYear',
       fk.Week AS 'AWeek',
       SUM(CASE WHEN t.startdate is not null then 1 ELSE 0 END)
FROM FakeWeeks fw
LEFT OUTER JOIN #TEMP t ON DATEPART(YEAR,startdate) = fw.year AND DATEPART(wk,startdate) = fw.week
GROUP BY DATEPART(YEAR,startdate),DATEPART(wk,startdate)
ORDER BY 1,2

Или, если вы чувствуете себя экономно, сгенерируйте две таблицы, одну с годами и одну с 1-52, и объедините обе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...