如何获得位型列的计数?

时间:2015-08-27 16:45:04

标签: sql sql-server tsql

我正在尝试使用SEDE来确定总共授予了多少个基于标记的徽章。我的典型策略是总结:

select sum(TagBased)
from Badges

不幸的是,由于TagBased有点值,我收到此错误:

  

操作数数据类型位对于sum运算符无效。

出于绝望,我试着数:

select count(TagBased)
from Badges

这计算非空值的数量,在这种情况下与count(*)相同。那么如何在聚合中使用一个比特值?

3 个答案:

答案 0 :(得分:11)

如果只是想要查看基于标记的徽章而不关心其余徽章,可以将测试移到where子句:

select count(*)
from Badges 
where TagBased = 1

规范解决方案是将位值转换为可以求和的数据类型:

select sum(cast(TagBased as decimal))
from Badges

更灵活的解决方案是使用CASE statement

自行进行转换
select sum(case TagBased when 1 then 100.0 end)/count(*) tag_based_per
from Badges

或者,在较新版本的SQL Server中,有一个IIF function

select sum(iif(TagBased = 1, 1, 0))
from Badges

最后,如果你正在打高尔夫球,你可以欺骗SQL为你转换这个位:

select sum(TagBased+0)
from Badges

这项技术的功劳归功于Kenneth Baltrinic对更具体问题的回答。

供参考(和潜在的分叉):my test queries

答案 1 :(得分:1)

来自COUNT列的BIT只有1的另一种方法是使用NULLIF

SELECT COUNT(NULLIF(TagBased,0)) AS result
FROM Badges b;

LiveDemo

<小时/> 使用SIGN的另一种方法:

SELECT SUM(SIGN(TagBased)) AS result
FROM Badges b;

LiveDemo2

又一个方法。我不知道为什么我写了它:

SELECT DISTINCT TOP 1 RANK() OVER(ORDER BY TagBased DESC) - 1
FROM Badges b
ORDER BY 1 DESC;

LiveDemo3

答案 2 :(得分:1)

使用位运算符的方法之一。

select sum(TagBased&1) from Badges

通常,您可以将多个位值存储在一个整数中。例如,我有5种类型的包。您可以输入以下值:

  • 1 - 代码
  • 2位
  • 4字节
  • 8 - 编程

如果您需要同时设置Codebyte。它将是1 + 4 = 5

现在如何统计Code bages计数

select sum(TagBased & 1) from Badges

现在如何统计Byte bages计数

select sum(TagBased & 4)/4 from Badges

现在同时,CodeByte bages一直都很重要

select count(TagBased & 5) from Badges where TagBased & 5 > 0