2016-08-27 7 views
2

Ich habe eine Tabelle mit Spalte leseneinzelne Abfrage von mehreren Abfrage schreiben

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

, wenn ich wie diese Abfrage

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

ist zeigt dieses Ergebnis

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

wieder wenn ich so frage

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

Ergebnisse

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

wieder, wenn ich diese Abfrage wie

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

Ergebnis

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

i eine einzelne Abfrage wollen die

Ergebnis in diesem Format erzeugen
[code] | [Total] | [PASS] | [FAIL] 
----  ----  ----  ---- 
1231 | 125 | 100 | 25 
1232 | 200 | 150 | 50 

, wie kann ich das tun

Antwort

1

Sie müssen Conditional Aggregation verwenden

die PASS Zahl zu erhalten, zählen nur die Zeilen nur, wenn ROUND([Test Mk],0) >= 24. Dies kann so erreicht werden.

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

Um die FAIL Count, zählen nur die Zeilen nur ROUND([Test Mk],0) < 24 wenn. Dies kann so erreicht werden.

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

Case Aussagen erzeugt 1 nur, wenn die Zeile die Bedingung erfüllt, sonst wird es NULL platzieren. Graf Aggregat überspringt die NULL Werte, während des Zählen

Als Ganze Abfrage

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

andere Art und Weise mit 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] 

Noch ein anderes (komisch):

;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]