web-dev-qa-db-fra.com

Comment obtenir le nombre vrai/faux d'un champ de bits dans deux colonnes distinctes

Je dois créer une requête qui additionnera le nombre de True (1) et de False (0) dans deux colonnes distinctes d'un champ de bits.

Je rejoins 3 tables et j'ai besoin que ce soit quelque chose comme:

Attribut | Classe | Pass | Échouer

Je vais regrouper sur Attribute et Class.

35
avgbody

Quelque chose comme ça:

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

Cela fonctionne (au moins dans SQL 2008) 

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

J'ajoute 0 à Passed dans la première somme en tant que méthode simple de conversion de bit en int puisque vous ne pouvez pas additionner les bits directement.

12
Kenneth Baltrinic
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
3
Russ Cam

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)
3
KM.

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
2
mrdenny

il y a même une autre option:

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