SQL - 2 считает в одном запросе - PullRequest
1 голос
/ 02 декабря 2010

У меня есть 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

Ответы [ 3 ]

9 голосов
/ 02 декабря 2010
;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
2 голосов
/ 02 декабря 2010

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

Я не учел вашу ХАЙВИНГ (Количество ())

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] 

Редактировать: вот некоторые тестовые данные

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)
0 голосов
/ 02 декабря 2010

да, вы должны быть в состоянии сделать СОЮЗ ВСЕХ между двумя таблицами

...