执行按位求和

时间:2010-12-14 11:43:47

标签: sql sql-server tsql

作为复杂聚合的一部分,我想知道某些数据的按位总和,即如果我有值为1,1,1,2,2,8的行按位总和是11.在这种情况下,这些值都是两个(单个位)的精确幂,所以我可以通过对组进行分组和求和来破解它(显然这个例子与真实查询相比有点折磨):

select SUM(y.test)
from (
    select x.test
    from ( -- garbage test data
        select 1 as [test]
        union all select 1
        union all select 1
        union all select 2
        union all select 2
        union all select 8) x
group by x.test) y

但是在[T] SQL中执行按位求和是否有一种干净的方法?

4 个答案:

答案 0 :(得分:18)

如果您的示例中所有测试值都是单个位(1,2,8) - 只需在查询中使用SUM(DISTINCT col)

希望有所帮助。

(供参考:http://msdn.microsoft.com/en-us/library/ms187810.aspx

答案 1 :(得分:3)

它有点令人费解,但是你做的就是你所追求的(请注意,我的位数高达128,你可能需要更高,或者可能不需要高于8)。

with data(i)
AS
(
    select 1 
        union all select 1
        union all select 1
        union all select 2
        union all select 2
        union all select 8
)
SELECT MAX(i & 1) +
MAX(i & 2) +
MAX(i & 4) +
MAX(i & 8) +
MAX(i & 16) +
MAX(i & 32) +
MAX(i & 64) +
MAX(i & 128)
from data

如果您愿意,显然可以转换为UDF。

答案 2 :(得分:0)

你有运营商|执行按位或2个操作数。使用游标和此运算符可以解决您的问题。

编辑 是的,我混淆了和,或者,固定。

答案 3 :(得分:0)

对于单个位,SUM(DISTINCT col)是最佳答案,但对于多个位,如3(= 1 | 2),这不起作用,最好和更快的答案将是这样的:

SELECT SUM(DISTINCT X.Text& T.B) FROM X交叉连接(值(1),(2),(4),(8),(16),(32),(64),(128),(256),(512))T(B)