Создайте строку в запросе агрегации для даты без результатов по ней - PullRequest
0 голосов
/ 15 января 2010

Извините, если заглавный вопрос не очень ясен, но я не думаю, что смогу объяснить мою проблему за один раз.

У меня есть таблица с множеством различных типов событий, записанных на дату.

Я запрашиваю таблицу и группировку на основе подмножества даты (месяц и год).

SELECT DATENAME(MONTH, event_date_time) + ' ' + DATENAME(YEAR, event_date_time), COUNT(reason)
FROM blacklist_history
WHERE (event_date_time BETWEEN DATEADD(mm,-6, '20/12/2009 23:59:59') AND '20/12/2009 23:59:59')
GROUP BY (DATENAME(MONTH, event_date_time) + ' ' + DATENAME(YEAR, event_date_time))
ORDER BY CONVERT(DATETIME, DATENAME(MONTH, event_date_time) + ' ' + DATENAME(YEAR, event_date_time)) ASC

(обычно у меня есть переменная для поля даты)

Этот запрос возвращает мои данные:

August    2009    15358
September 2009    48722
October   2009    19143
November  2009    4205
December  2009    3286

Теперь я хочу, чтобы запрос также возвращался за июль 2009 года, но возвращал счетчик 0. Я знаю, что SQL Server не может просто волшебно это сделать из ничего, но я не могу видеть в моем Подумайте, как мне создать данные, к которым я хочу присоединиться, на основе моего результата, чтобы заполнить пустое место на июль.

Любые предложения будут полезны. (С использованием SQL Server 2005)

Спасибо

Ответы [ 3 ]

1 голос
/ 15 января 2010

Обычный подход для этого состоит в том, чтобы просто иметь таблицу дат в вашей базе данных и выполнять ЛЕВЫЕ СОЕДИНЕНИЯ от нее к вашим данным.

0 голосов
/ 15 января 2010
WITH    months (d) AS
        (
        SELECT  CAST('2009-01-01' AS DATETIME)
        UNION ALL
        SELECT  DATEADD(month, d, 1)
        FROM    months
        WHERE   d <= '2015-01-01'
        )
SELECT  d, COUNT(reason)
FROM    months
JOIN    blacklist_history bh
ON      event_date_time >= d
        AND event_date_time < DATEADD(month, d, 1)
GROUP BY
        d
0 голосов
/ 15 января 2010

Вы можете вставить список всех месяцев, которые вас интересуют, в переменную таблицы, а затем выполнить ВНЕШНЕЕ соединение из этой таблицы с таблицей, содержащей ваши данные.

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