我有下表
|ID |Types|Amount|
|-----------------|
|1 |1 |12 |
|2 |3 |3 |
|3 |4 |5 |
|4 |5 |2 |
|-----------------|
Types
是基于类型值的按位或的值。
让我们说:
我想要实现的是按类型分组的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事务中完成?
答案 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