如何将SUM用于位列?

时间:2015-11-26 12:21:13

标签: sql sql-server tsql aggregate-functions

如何在T-SQL中对位列使用函数SUM()?

当我尝试按以下方式执行时:

SELECT SUM(bitColumn) FROM MyTable;

我收到错误:

  

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

7 个答案:

答案 0 :(得分:37)

SELECT SUM(CAST(bitColumn AS INT))
FROM dbo.MyTable

需要投入数字

或其他解决方案 -

SELECT COUNT(*)
FROM dbo.MyTable
WHERE bitColumn = 1

答案 1 :(得分:13)

您可以将0视为空值,并简单地计算剩余值:

SELECT count(nullif(bitColumn, 0))
FROM MyTable;

答案 2 :(得分:4)

您可以使用CONVERT

来实现
SELECT SUM(CONVERT(INT, bitColumn)) FROM MyTable

答案 3 :(得分:2)

SELECT SUM(bitColumn * 1)FROM dbo.MyTable

通过乘法,简洁和简单将该位转换为int

答案 4 :(得分:1)

您可以将CAST和CONVERT函数用于数据类型为整数或数字数据类型。

试试这个代码块:

SELECT SUM(CAST(bitColumn AS INT)) as bitColumn
FROM MyTable

SELECT CONVERT(INT, bitColumn) 
FROM MyTable

答案 5 :(得分:1)

我的个人偏好是 CASE 声明。

SELECT SUM(CASE WHEN bitColumn = 1 THEN 1 ELSE 0 END) FROM MyTable;

或者,如果您真的热衷于代码压缩 IIF

SELECT SUM(IIF(bitColumn = 1, 1, 0)) FROM MyTable;

答案 6 :(得分:0)

有些隐蔽:

declare @Foo as Bit = 1;
-- @Foo is a Bit.
select SQL_Variant_Property( @Foo, 'BaseType' );
-- But adding zero results in an expression with data type Int.
select SQL_Variant_Property( @Foo + 0, 'BaseType' );
select Sum( @Foo + 0 );

declare @Samples as Table ( Foo Bit );
insert into @Samples ( Foo ) values ( 0 ), ( 1 ), ( 0 ), ( 0 ), ( 1 ), ( 1 ), ( 1 ), ( 1 );
select Sum( Foo + 0 ) from @Samples;

这肯定不会提高可读性或可维护性,但它很紧凑。