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

Posted

技术标签:

【中文标题】如何将位字段的真/假计数分为两个单独的列【英文标题】:How to get the true/false count from a bit field into two separate columns 【发布时间】:2010-12-04 17:20:48 【问题描述】:

我需要创建一个查询,它将 True(1) 和 False(0) 的数量与一个位字段相加到两个单独的列中。

我要加入 3 张桌子,需要它是这样的:

属性 |班级 |通行证 |失败

我将根据属性和类进行分组。

【问题讨论】:

【参考方案1】:

类似这样的:

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

【讨论】:

这段代码中有三个错误,缺少两个“END”命令,并且在 CASE 中使用了“WHERE”而不是“WHEN”。 我陷入了尝试使用 PIVOT 的困境,而这正是我所需要的 - 轻松多了。谢谢!【参考方案2】:

这有效(至少在 SQL 2008 中)

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

我在第一个总和中添加 0 作为从位转换为整数的简便方法,因为您不能直接对位求和。

【讨论】:

PostgreSQL 与 SUM(CAST(Passed as Integer)) PASS, SUM(1 - CAST(Passed AS Integer) FAIL 一起使用。【参考方案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

【讨论】:

【参考方案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)

【讨论】:

【参考方案5】:
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

【讨论】:

【参考方案6】:

还有一个选择:

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

【讨论】:

以上是关于如何将位字段的真/假计数分为两个单独的列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 c# 更新访问中的真/假字段?

MongoDB 聚合两个集合,返回附加字段作为计数

将两个 SQL 查询的结果组合为单独的列

如何通过两个不同的子句同时查询两个字段的计数?

从一个表中选择,并从另外两个表中进行计数

MySQL - 在单独的列中跟踪重复记录类型