作为复杂聚合的一部分,我想知道某些数据的按位总和,即如果我有值为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中执行按位求和是否有一种干净的方法?
答案 0 :(得分:18)
如果您的示例中所有测试值都是单个位(1,2,8) - 只需在查询中使用SUM(DISTINCT col)
。
希望有所帮助。
答案 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)