2009-10-07 13 views

risposta

62

Qualcosa di simile a questo:

SUM(CASE WHEN ColumnName = 1 THEN 1 ELSE 0 END) AS Pass, 
SUM(CASE WHEN ColumnName = 0 THEN 1 ELSE 0 END) AS Fail 
+1

questo codice ha tre errori in esso, mancano due comandi "fine" e con "dove" e non "quando" nel caso. –

+1

Avete ragione, signore! Modificato. –

+1

... ma l'OP non ha badato agli errori e l'ha accettato ... –

2

Un'altra opzione sarebbe

SELECT Attribute, Class 
     COUNT(CASE WHEN ColumnName = 1 THEN 1 END) Pass, 
     COUNT(CASE WHEN ColumnName = 0 THEN 1 END) Fail FROM YourTable 
GROUP BY Attribute, Class 
3
SELECT 
    Attribute, 
    Class, 
    SUM(CASE BitField WHEN 1 THEN 1 ELSE 0 END) AS [Pass], 
    SUM(CASE BitField WHEN 0 THEN 1 ELSE 0 END) AS [Fail] 
FROM 
    Table 
GROUP BY 
    Attribute, 
    Class 
2

prova:

declare @table table (columnName bit) 
insert into @table values (1) 
insert into @table values (1) 
insert into @table values (1) 
insert into @table values (1) 
insert into @table values (1) 
insert into @table values (0) 
insert into @table values (0) 
insert into @table values (0) 
insert into @table values (0) 

SELECT 
    SUM(CASE WHEN ColumnName = 1 THEN 1 ELSE 0 END) AS True1 
    , SUM(CASE WHEN ColumnName = 0 THEN 1 ELSE 0 END) AS False0 
from @Table 

USCITA:

True1  False0 
----------- ----------- 
5   4 

(1 row(s) affected) 
11

Questo funziona (almeno in SQL 2008)

SELECT SUM(Passed + 0) PASS , SUM(1 - Passed) FAIL 

sto aggiungendo 0 al passato nella prima somma come un breve tratto mano di conversione da bit a int perché non si può sommare direttamente bit.

+1

PostgreSQL funziona con 'SUM (CAST (Passed as Integer)) PASS, SUM (1 - CAST (Passed AS Integer) FAIL'. – karmakaze

0

c'è ancora una possibilità di più:

SELECT 
    Attribute, 
    Class, 
    COUNT(BoolColumnName = 1 or NULL) Pass, 
    COUNT(BoolColumnName = 0 or NULL) Fail 
FROM Table 
GROUP BY Attribute, Class 
Problemi correlati