我必须在group by中使用按位运算,但我找到了任何东西。
表:
PermissionId, BitMask(BigInt)
1, 4
2, 7
1, 8
1, 5
我想要结果;
1, 13
2, 7
如何在MSSQL中编写此脚本,如下所示
SELECT PermissionId, BIT_OR(BitMask)
FROM table
GROUP BY PermissionId
答案 0 :(得分:1)
你的问题变得非常有趣。
创建此功能(您可能需要重新考虑名称)
CREATE function f_test
(
@param bigint
)
returns @t table (value bigint)
AS
BEGIN
;WITH CTE AS
(
SELECT
@param % 2 value,
1 multiplier,
@param / 2 remain
UNION ALL
SELECT
remain % 2,
multiplier * 2,
remain / 2
FROM
CTE
WHERE
remain > 0
)
INSERT @t
SELECT multiplier
FROM CTE
WHERE value = 1
RETURN
END
现在您可以运行此脚本,我正在使用表变量,将其替换为您的表:
DECLARE @t table(PermissionId int, BitMask bigint)
INSERT @t values(1,4),(2,7),(1,8),(1,5)
SELECT
t1.PermissionId,
SUM(distinct t2.Value) Total
FROM
@t t1
CROSS APPLY
f_test(t1.BitMask) t2
GROUP BY
t1.PermissionId
结果:
PermissionId Total
1 13
2 7