2009-10-07 10 views

Respuesta

62

Algo como esto:

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

este código tiene tres errores en ella, faltan dos comandos "END" y el uso de "dónde" y no "cuando" en el caso. –

+1

¡Tiene razón, señor! Editado –

+1

... pero al OP no le importaron los errores y lo aceptó ... –

2

Otra opción sería

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

intento:

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 

SALIDA:

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

(1 row(s) affected) 
11

Esto funciona (al menos en SQL 2008)

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

Estoy añadiendo 0 a Aprobada en la primera suma como una forma abreviada de la conversión de bits a int ya que no puede resumir directamente bits.

+1

PostgreSQL funciona con 'SUM (CAST (Pasado como Integer)) PASS, SUM (1 - CAST (Pasado AS Integer) FAIL'. – karmakaze

0

no es ni siquiera una opción más:

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