2016-08-27 4 views
2

У меня есть таблица чтения с колонкинаписание одного запроса из нескольких запроса

[code]|[Test Mk] 
    ----- ----- 
    1231 | 22.5 
    1223 | 13.5 
    1231 | 24.25 
    1232 | 25.0 
    .... .... 

, когда я запрос, как этот

select [code], COUNT([code]) as Total 
from reading 
group by [code] 

это показывает этот результат

code |Total 
----  ---- 
1237 |728 
1233 |698 
1232 |701 
1236 |651 
1231 |655 
1235 |626 
1234 |636 
1238 |685 

снова когда я спрашиваю, как это

select [code], COUNT([code]) as FAIL 
from Reading 
where ROUND([Test Mk],0) < 24 
group by [code] 

результаты

code | FAIL 
---- | ---- 
1237 | 617 
1233 | 422 
1232 | 60 
1236 | 81 
1231 | 271 
1235 | 517 
1234 | 149 
1238 | 69 

еще раз, когда я запрос, как этот

select [code], COUNT([code]) as PASS 
from Reading 
where ROUND([Test Mk],0) >= 24 
group by [code] 

результате

code | PASS 
---- | ---- 
1237 | 111 
1233 | 276 
1232 | 641 
1236 | 570 
1231 | 384 
1235 | 109 
1234 | 487 
1238 | 616 

я хочу один запрос, который генерирует результат в этом формате

[code] | [Total] | [PASS] | [FAIL] 
----  ----  ----  ---- 
1231 | 125 | 100 | 25 
1232 | 200 | 150 | 50 

, как мне это сделать

ответ

1

Вы должны использовать Conditional Aggregation

Чтобы получить количество PASS, просто посчитать строки только тогда, когда ROUND([Test Mk],0) >= 24. Это может быть достигнуто именно так.

Count(Case when ROUND([Test Mk],0) >= 24 then 1 END) 

Чтобы получить количество FAIL, просто посчитать строки только тогда, когда ROUND([Test Mk],0) < 24. Это может быть достигнуто именно так.

Count(Case when ROUND([Test Mk],0) < 24 then 1 END) 

Case заявление генерирует 1 только тогда, когда строка удовлетворяет условию еще это будет местом NULL. Граф совокупность пропускает NULL значения при подсчете

В целом запроса

select [code], 
     COUNT([code]) as Total, 
     Count(Case when ROUND([Test Mk],0) >= 24 then 1 END) as PASS, 
     Count(Case when ROUND([Test Mk],0) < 24 then 1 END) as FAIL 
from reading 
group by [code] 
0

Другим способом с SUM:

SELECT [code], 
     COUNT([code]) as [Total], 
     SUM(CASE WHEN ROUND([Test Mk],0) >= 24 THEN 1 ELSE 0 END) as [PASS], 
     SUM(CASE WHEN ROUND([Test Mk],0) < 24 THEN 1 ELSE 0 END) as [FAIL] 
FROM reading 
GROUP BY [code] 

и еще одна (странным):

;WITH [code] As(
    select [code], COUNT([code]) as Total 
    from reading 
    group by [code] 
), [fails] AS (
    select [code], COUNT([code]) as [FAIL] 
    from Reading 
    where ROUND([Test Mk],0) < 24 
    group by [code] 
), [passed] AS (
    select [code], COUNT([code]) as [PASS ] 
    from Reading 
    where ROUND([Test Mk],0) >= 24 
    group by [code] 
) 

SELECT c.[code], 
     c.[Total], 
     f.[FAIL], 
     p.[PASS] 
FROM [code] c 
LEFT JOIN [fails] f 
    ON c.[code] = f.[code] 
LEFT JOIN [passed] p 
    ON c.[code] = p.[code] 
Смежные вопросы