sql - 如何获取位类型列的计数?

标签 sql sql-server tsql

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

select sum(TagBased)
from Badges

不幸的是,由于 TagBased 是一个位值,我收到此错误:

Operand data type bit is invalid for sum operator.

出于绝望,我尝试计数:

select count(TagBased)
from Badges

这会计算非空值的数量,在本例中与 count(*) 相同。那么一个位值如何聚合使用呢?

最佳答案

如果您只是想查看基于标签的徽章而不关心其余部分,则可以将测试移至 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对更具体问题的回答。

供引用(和潜在的 fork ):my test queries .

关于sql - 如何获取位类型列的计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32255152/

相关文章:

SQL 和 VB.NET : SELECT query using data in textbox

sql - 选择查询以使用时间戳恰好在 3 天之前获取数据

sql-server - SQL Server 唯一约束(但只是有时)

sql - 如何立即终止/停止长 SQL 查询?

sql - 从非常大的表中删除重复的子集

sql - 如何加入 "most recent"记录?

java - 在 NamedParameterJdbcTemplate.batchUpdate 中禁用自动提交

mysql - 如何在分层类别树中找到我的节点及其 anchor 的所有兄弟节点?

java - 主键的 Hibernate @GeneratedValue 空错误

sql - 如何在 WHERE LIKE 中对多个值使用 SELECT 语句