如何将 SUM 用于位列?
How can I use SUM for bit columns?
如何对 T-SQL 中的位列使用函数 SUM()?
当我尝试按以下方式执行时:
SELECT SUM(bitColumn) FROM MyTable;
我收到错误:
Operand data type bit is invalid for sum operator.
SELECT SUM(CAST(bitColumn AS INT))
FROM dbo.MyTable
需要转换成数字
或其他解决方案 -
SELECT COUNT(*)
FROM dbo.MyTable
WHERE bitColumn = 1
可以通过CONVERT
,
实现
SELECT SUM(CONVERT(INT, bitColumn)) FROM MyTable
您可以将 0 视为空值并简单地计算剩余值:
SELECT count(nullif(bitColumn, 0))
FROM MyTable;
您可以使用 CAST 和 CONVERT 函数将数据类型转换为整数或数字数据类型。
试试这个代码块:
SELECT SUM(CAST(bitColumn AS INT)) as bitColumn
FROM MyTable
或
SELECT CONVERT(INT, bitColumn)
FROM MyTable
有点神秘:
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;
这当然不会提高可读性或可维护性,但它很紧凑。
SELECT SUM(bitColumn * 1) FROM dbo.MyTable
通过乘法将位转换为 int,简洁明了
您可以使用 SIGN
函数:
CREATE TABLE tab_x(b BIT);
INSERT INTO tab_x(b) VALUES(1),(0),(0),(NULL),(0),(1);
SELECT SUM(SIGN(b))
FROM tab_x;
-- 2
我个人的偏好是 CASE
声明。
SELECT SUM(CASE WHEN bitColumn = 1 THEN 1 ELSE 0 END) FROM MyTable;
或者,如果您真的热衷于代码压缩 IIF
。
SELECT SUM(IIF(bitColumn = 1, 1, 0)) FROM MyTable;
如何对 T-SQL 中的位列使用函数 SUM()?
当我尝试按以下方式执行时:
SELECT SUM(bitColumn) FROM MyTable;
我收到错误:
Operand data type bit is invalid for sum operator.
SELECT SUM(CAST(bitColumn AS INT))
FROM dbo.MyTable
需要转换成数字
或其他解决方案 -
SELECT COUNT(*)
FROM dbo.MyTable
WHERE bitColumn = 1
可以通过CONVERT
,
SELECT SUM(CONVERT(INT, bitColumn)) FROM MyTable
您可以将 0 视为空值并简单地计算剩余值:
SELECT count(nullif(bitColumn, 0))
FROM MyTable;
您可以使用 CAST 和 CONVERT 函数将数据类型转换为整数或数字数据类型。
试试这个代码块:
SELECT SUM(CAST(bitColumn AS INT)) as bitColumn
FROM MyTable
或
SELECT CONVERT(INT, bitColumn)
FROM MyTable
有点神秘:
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;
这当然不会提高可读性或可维护性,但它很紧凑。
SELECT SUM(bitColumn * 1) FROM dbo.MyTable
通过乘法将位转换为 int,简洁明了
您可以使用 SIGN
函数:
CREATE TABLE tab_x(b BIT);
INSERT INTO tab_x(b) VALUES(1),(0),(0),(NULL),(0),(1);
SELECT SUM(SIGN(b))
FROM tab_x;
-- 2
我个人的偏好是 CASE
声明。
SELECT SUM(CASE WHEN bitColumn = 1 THEN 1 ELSE 0 END) FROM MyTable;
或者,如果您真的热衷于代码压缩 IIF
。
SELECT SUM(IIF(bitColumn = 1, 1, 0)) FROM MyTable;