2012-05-10 2 views
1

Как создать оператор select с группой по возвращаемым значениям для всех часов, даже если в базе данных есть несколько часов?Создать инструкцию SELECT с GROUP BY

У меня есть следующий запрос:

SELECT 
    DAY(OccurredAt) AS [Day], 
    DATEPART(HOUR,OccurredAt) AS [Hour], 
    COUNT(ID) AS [Errors] 
FROM 
    Database..Error WITH (NOLOCK) 
WHERE 
    YEAR(OccurredAt) = 2012 
    AND MONTH(OccurredAt) = 5 
GROUP BY 
    DAY(OccurredAt), DATEPART(HOUR,OccurredAt) 
ORDER BY 
    DAY(OccurredAt), DATEPART(HOUR,OccurredAt) 

возвращает данные, как это:

Day Hour Errors 
1 1 2 
1 4 2 
1 6 1 
1 7 1 
1 9 3 
1 10 1 
1 11 1 
1 14 19 
1 15 7 
1 16 234 
1 17 54 
1 18 17 
1 19 109 
1 20 27 
1 22 2 
2 6 2 
2 7 1 
2 8 2 
2 9 1 
2 10 44 
2 11 2 
2 15 1 
2 16 3 
2 18 2 
2 19 41 
2 20 108 
2 21 106 
2 22 36 
2 23 2 

Я хотел бы его вернуть данные, как это:

Day Hour Errors 
1 0 0 
1 1 2 
1 2 0 
1 3 0 
1 4 2 
1 5 0 
1 6 1 
1 7 1 
1 8 0 
1 9 3 
1 10 1 
1 11 1 
1 12 0 
1 13 0 
1 14 19 
1 15 7 
1 16 234 
1 17 54 
1 18 17 
1 19 109 
1 20 27 
1 21 0 
1 22 2 
1 23 0 

Поэтому в основном я нужны часы, где в результатах запроса есть нулевые ошибки. Они должны будут отображаться для всего диапазона дат, в этом случае все май 2012 года.

Пробовал несколько вещей, но пока не повезло.

+3

Вам понадобится таблица со всеми 24 часами, затем вы можете ['OUTER JOIN'] (http://msdn.microsoft.com/en-us/library/aa213228%28v=sql.80%29.aspx) Это. –

ответ

1

Это запрос, который я использую для выбора материала на сутки основе:

WITH Dates AS (
SELECT 
[Date] = CONVERT(DATETIME,'01/01/2012') 
UNION ALL SELECT 
[Date] = DATEADD(DAY, 1, [Date]) 
FROM 
Dates 
WHERE 
Date < '12/31/2012' 
) 
SELECT [Date] 
FROM Dates 
OPTION (MAXRECURSION 400) 

Вы можете расширить его так, как вам нравится с соединениями на дату в таблице вам нужно.

Не 100% ответ, возможно, но это должно помочь вам встать на ваш путь.

EDIT: Рекурсивные CTE могут работать плохо. поэтому используйте разумно

2

Вместо использования временных таблиц или CTE используйте постоянные таблицы. В почти всех базах данных чрезвычайно полезно иметь таблицу чисел (или целых чисел) и таблицу календаря. Тогда запросы, подобные вашим, становятся легкими, потому что просто сделать внешнее соединение на этих таблицах, чтобы заполнить отсутствующие числа или даты, отсутствующие в «реальных» данных. Это, конечно же, в дополнение к их многим другим видам использования.

Альтернативой является повторение дублирующих CTE и/или незаметных жестко закодированных функций через ваш код.