2010-12-02 4 views
1

У меня есть 2 запросов, которые возвращают счетчик различной информации в таблице:SQL - 2 Графов в одном запросе

SELECT Date, COUNT(*) AS Total 
FROM Table 
WHERE Type = 7 AND Date >= '2010-01-01' 
GROUP BY Date 
HAVING COUNT(*) > 5000 
ORDER BY Date 

который возвращает итоговые данные для всех из «занято» Даты проведения:

Date  Total 
---------- ----------- 
2010-01-05 9466 
2010-02-02 8747 
2010-03-02 9010 
2010-04-06 7916 
2010-05-05 9342 
2010-06-02 8723 
2010-07-02 7829 
2010-08-03 8411 
2010-09-02 7687 
2010-10-04 7706 
2010-11-02 8567 
2010-12-02 7645 

и

SELECT Date, COUNT(*) AS Failures 
FROM Table 
WHERE Type = 7 AND ErrorCode = -2 AND Date >= '2010-01-01' 
GROUP BY Date 
ORDER BY Date 

, который возвращает общее количество отказов (все из которых произошли на оживленной дате):

Date  Failures 
---------- ----------- 
2010-09-02 29 
2010-10-04 16 
2010-11-02 8 

Можно ли объединить их в один запрос, чтобы вернуть один результат?

т.д .:

Date  Total  Failures 
---------- ----------- ----------- 
2010-01-05 9466 
2010-02-02 8747 
2010-03-02 9010 
2010-04-06 7916 
2010-05-05 9342 
2010-06-02 8723 
2010-07-02 7829 
2010-08-03 8411 
2010-09-02 7687   29 
2010-10-04 7706   16 
2010-11-02 8567   8 
2010-12-02 7645 

ответ

9
;With baseData As 
(
SELECT 
     Date, 
     COUNT(*) AS Total, 
     COUNT(CASE WHEN ErrorCode = -2 THEN 1 END) AS Failures 
FROM Table 
WHERE Type = 7 AND Date >= '2010-01-01' 
GROUP BY Date 
) 
SELECT 
    Date, 
    Total, 
    Failures, 
    CAST(Failures AS float)/Total AS Ratio 
FROM baseData 
WHERE Total > 5000 OR Failures > 0 
ORDER BY Date 
+0

Awesome, спасибо ! Я получаю предупреждение: «Значение Null исключается агрегированием или другой операцией SET». Но результат - именно то, что я хотел. – Shevek 2010-12-02 12:25:09

+0

Теперь мне нужен четвертый столбец, который показывает процент отказов :) – Shevek 2010-12-02 12:26:37

0

да вы должны быть в состоянии сделать UNION ALL между 2 таблицами

+0

Это просто возвращает 15 строк из 2 столбцов – Shevek 2010-12-02 12:18:47

2

Если вы можете реорганизовать к тому же, где положение, это должно быть возможно.

Я не взял свой HAVING (Count()) во внимание

SELECT [Date], COUNT(*) AS Total, SUM(CASE WHEN ErrorCode = -2 THEN 1 ELSE 0 END) AS Failures 
FROM [Table] 
WHERE [Type] = 7 AND [Date] >= '2010-01-01' 
GROUP BY [Date] 
ORDER BY [Date] 

Edit: Вот некоторые тестовые данные

create table [Table] 
(
[ErrorCode] int, 
[Type] int, 
[Date] datetime 
) 

insert into [table]([Date], [Type], [ErrorCode])values ('1 Jan 2010', 7, 0) 
insert into [table]([Date], [Type], [ErrorCode])values ('1 Jan 2010', 7, -2) 
insert into [table]([Date], [Type], [ErrorCode])values ('2 Jan 2010', 7, -2) 
insert into [table]([Date], [Type], [ErrorCode])values ('2 Jan 2010', 8, -2) 
insert into [table]([Date], [Type], [ErrorCode])values ('2 Jan 2010', 7, 1) 
Смежные вопросы