Je dois utiliser des opérations bit à bit en groupe mais j'ai trouvé quelque chose.
table:
PermissionId, BitMask(BigInt) 1, 4 2, 7 1, 8 1, 5
Je veux des résultats comme;
1, 13 2, 7
Comment puis-je écrire ce script dans MSSQL comme ci-dessous
SELECT PermissionId, BIT_OR(BitMask) FROM table GROUP BY PermissionId
Votre question est devenue très intéressante.
Créez cette fonction (vous pouvez reconsidérer le nom)
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
Maintenant, vous pouvez exécuter ce script, j'utilise une variable de table, remplacez-la par votre table:
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
Résultat:
PermissionId Total 1 13 2 7