2009-10-07 9 views

Odpowiedz

62

coś takiego:

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

kod ten ma trzy błędy w nim brakujące dwa „koniec” i za pomocą komendy „gdzie”, a nie „kiedy” w tej sprawie. –

+1

Masz rację, proszę pana! Edytowane. –

+1

... ale OP nie miał nic przeciwko tym błędom i je zaakceptował ... –

2

Innym rozwiązaniem byłoby

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

try:

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 

WYJŚCIE:

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

(1 row(s) affected) 
11

Działa to (przynajmniej w SQL 2008)

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

dodaję 0 do Przekazywana w pierwszej sumy jako krótki sposób strony konwersji z odrobiną do int, ponieważ nie można podsumować bitów bezpośrednio.

+1

PostgreSQL działa z 'SUMĄ (CAST (przeszedł jako Integer)) PASS, SUM (1 - CAST (przekazane jako liczba całkowita) FAIL". – karmakaze

0

istnieje jeszcze jedna opcja:

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