2009-10-07 7 views

Répondre

62

Quelque chose comme ceci:

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

ce code a trois erreurs qu'il contient, manquant deux commandes « END » et en utilisant « OU » et non « QUAND » dans le cas. –

+1

Vous avez raison, monsieur! Édité. –

+1

... encore l'OP ne s'est pas occupé des erreurs et l'a accepté ... –

2

Une autre option serait

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

essayer:

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 

SORTIE:

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

(1 row(s) affected) 
11

Cela fonctionne (au moins dans SQL 2008)

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

J'ajoute 0 à passé dans la première somme comme un moyen de sténographie de conversion de bit int puisque vous ne pouvez pas résumer les bits directement.

+1

PostgreSQL fonctionne avec SUM (CAST (passé en entier)) PASS, SUM (1 - CAST (Passé AS Integer) FAIL). – karmakaze

0

il y a même une option supplémentaire:

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