我正在尝试使用SEDE来确定总共授予了多少个基于标记的徽章。我的典型策略是总结:
select sum(TagBased)
from Badges
不幸的是,由于TagBased
有点值,我收到此错误:
操作数数据类型位对于sum运算符无效。
出于绝望,我试着数:
select count(TagBased)
from Badges
这计算非空值的数量,在这种情况下与count(*)
相同。那么如何在聚合中使用一个比特值?
答案 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种类型的包。您可以输入以下值:
如果您需要同时设置Code
和byte
。它将是1 + 4 = 5
现在如何统计Code
bages计数
select sum(TagBased & 1) from Badges
现在如何统计Byte
bages计数
select sum(TagBased & 4)/4 from Badges
现在同时,Code
和Byte
bages一直都很重要
select count(TagBased & 5) from Badges where TagBased & 5 > 0