Как получить количество истинных/ложных значений из битового поля в два отдельных столбца

Мне нужно создать запрос, который будет суммировать число True (1) и False (0) в два отдельных столбца из одного битового поля.

Я присоединяюсь к 3 таблицам, и мне нужно, чтобы это было примерно так:

Атрибут | Класс | Пройти | Неудача

Я буду группировать по атрибуту и ​​классу.


person avgbody    schedule 07.10.2009    source источник


Ответы (5)


Что-то вроде этого:

SUM(CASE WHEN ColumnName = 1 THEN 1 ELSE 0 END) AS Pass, 
SUM(CASE WHEN ColumnName = 0 THEN 1 ELSE 0 END) AS Fail
person Matthew Jones    schedule 07.10.2009
comment
в этом коде есть три ошибки: отсутствуют две команды END и используется WHERE, а не WHEN в CASE. - person KM.; 07.10.2009
comment
Я пошел в кроличью нору, пытаясь использовать PIVOT, когда это было все, что мне было нужно - так намного проще. Спасибо! - person BlueSix; 20.04.2017

Это работает (по крайней мере, в SQL 2008)

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

Я добавляю 0 к Passed в первой сумме в качестве короткого способа преобразования битов в int, поскольку вы не можете суммировать биты напрямую.

person Kenneth Baltrinic    schedule 21.12.2010
comment
PostgreSQL работает с SUM(CAST(Passed as Integer)) PASS, SUM(1 - CAST(Passed AS Integer) FAIL. - person karmakaze; 08.12.2012

Другой вариант был бы

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
person mrdenny    schedule 07.10.2009

пытаться:

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

ВЫХОД:

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

(1 row(s) affected)
person KM.    schedule 07.10.2009

есть еще один вариант:

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