如何将位字段的真/假计数分为两个单独的列
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
【讨论】:
以上是关于如何将位字段的真/假计数分为两个单独的列的主要内容,如果未能解决你的问题,请参考以下文章