如何将位字段中的真/假计数转换为两个单独的列

42

我需要创建一个查询,将一个二进制字段中True(1)和False(0)的数量分别累加到两个不同的列中。

我正在连接3个表格,并需要像这样:

属性 | 类 | 通过 | 失败

我将按照属性和类别进行分组。

6个回答

78

就像这样:

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
这段代码有三个错误,缺少两个“END”命令,并且在CASE语句中使用了“WHERE”而不是“WHEN”。 - KM.
1
我曾经陷入了使用PIVOT的兔子洞,而这正是我所需要的 - 简单得多。谢谢! - BlueSix

13

这个有效(至少在 SQL 2008 中)

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

在第一个求和中,我将0加到"Passed"中,这是一种将位转换为整数的简写方式,因为不能直接对位求和。


2
PostgreSQL 使用 SUM(CAST(Passed as Integer)) PASS, SUM(1 - CAST(Passed AS Integer) FAIL - karmakaze

4

尝试:

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)

3
另一个选择是:
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

这将导致结果数量包括通过和失败的结果。 应该是总数。 - DonCarleone
1
不,它不会。如果ColumnName的值不匹配,则它将返回null,而这并不会被COUNT计算。 - mrdenny

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

0

甚至还有一个选项:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接