如何让SQL以特定顺序处理聚合

时间:2014-11-04 21:34:47

标签: sql sql-server

我正在尝试为SQL Server 2012编写SQL查询,该查询将返回varbinary值,其中值中的位表示对系统中特定模块的权限。因此,例如,如果我有权访问模块1,4和10,查询将返回0x0209(位1,4和10打开)

我有一个查询,它会在一个单独的行中返回二进制值的每个字节(请记住,这是一个返回一些特定值的查询,仅用于测试逻辑):

SELECT CONVERT(varchar(5), CONVERT(varbinary(1), SUM(POWER(2, ((ModuleID-1)%8)))),2) AS ByteMask
     , (ModuleID-1) / 8 AS ByteNumber
FROM Gideon.Permission
WHERE IsBaseModulePermission = 1
AND ModuleID <> 3
AND ModuleID <> 8
GROUP BY (ModuleID-1) / 8

返回:

ByteMask  ByteNumber
  '7B'       1
  'FF'       2
  '01'       3

ByteMask是一个VarChar,我需要将它们组合成ByteNumber DESC的字符串排序。结果将是01FF7B。然后我将此字符串转换为varbinary。我有一个用户定义的聚合函数Concat,它将为我连接字符串。所以查询

SELECT dbo.Concat(DrvTable.ByteMask, '') AS ByteString
FROM (
    SELECT CONVERT(varchar(5), CONVERT(varbinary(1), SUM(POWER(2, ((ModuleID-1)%8)))),2) AS ByteMask
         , (ModuleID-1) / 8 AS ByteNumber
    FROM Gideon.Permission
    WHERE IsBaseModulePermission = 1
    AND ModuleID <> 3
    AND ModuleID <> 8
    GROUP BY (ModuleID-1) / 8
) AS DrvTable

将返回&#39; 7BFF01&#39;

的VarChar

这是我被卡住的地方。需要返回的值是&#39; 01FF7B&#39;。 ByteMask字符串的串联需要由ByteNumber DESC排序。在派生表上放置TOP 100 PERCENT和ORDER BY对结果没有影响。您不能在用户定义的聚合函数上使用OVER子句。

所以,我希望有人能够以完全不同的方式实现这一目标,或者能够告诉我如何从派生表中获取按特定顺序传递给Concat聚合函数的行。 / p>

0 个答案:

没有答案