基于按位运算条件的列的总和

时间:2020-01-14 09:36:35

标签: mysql sql

我有下表

|ID  |Types|Amount|
|-----------------|
|1   |1    |12    |
|2   |3    |3     |
|3   |4    |5     |
|4   |5    |2     |
|-----------------|

Types是基于类型值的按位或的值。

让我们说:

  • Type0为1(1 << 0)
  • 类型1为2(1 << 1)
  • Type2为4(1 << 2)

我想要实现的是按类型分组的SUM金额。

此表的结果应如下所示:

Type0: 17 (12+3+2, from ID 1,2,4)
Type1: 3 (from ID 2)
Type2: 7 (5+2 from ID 3,4)

是否可以在单个sql事务中完成?

1 个答案:

答案 0 :(得分:2)

如果您还没有一个位掩码,则可以使用并集为您的位掩码创建一个表(我认为应该创建一个,但这不是这个答案的重点),然后使用按位逻辑将它们连接在一起,然后按type_name分组,以获取每种类型的总数。

SELECT
    type_name
  , SUM(Amount)
FROM (
    SELECT 'type 0' AS type_name, 1 AS type_bitmask
    UNION
    SELECT 'type 1',2
    UNION
    SELECT 'type 2',4
) AS derived_types
JOIN [Your amounts table] AS amounts_table
    ON
    amounts_table.Types & derived_types.type_bitmask = derived_types.type_bitmask
GROUP BY
    type_name

请注意,这可以缩短:

SELECT 1<<x.types type
     , SUM(y.amount) total
  FROM 
     ( SELECT 0 types
        UNION
       SELECT 1
        UNION
       SELECT 2
     ) x
  JOIN my_table y
    ON y.types & 1<<x.types = 1<<x.types
 GROUP 
    BY 1<<x.types