在 Oracle SQL 中使用自定义无不相交组进行分组

问题描述 投票:0回答:1

Oracle 19c

我有一个包含 20 多列数值的表格,我想通过基于一列的自定义组对它们进行求和。例如,在下一个表中,我想要基于组 G1、G2 和 G3 的

Quant_1
Quant_2
列的总和,其中 G1 是
Category
(数值)为 <= 2, G2 are the rows where
Category
为 <= 4 even 1 and 2, and G3 are the rows where
Category
的行是 <= 6.

姓名 类别 定量_1 定量_2
姓名1 1 10 5
姓名1 1 10 5
名称2 2 11 6
姓名1 3 12 7
名称2 4 13 8
姓名1 5 14 9
名称2 6 15 10
姓名1 7 20 20

因此,在这个示例中,我想通过

Name
和我的自定义组进行聚合以获得此结果:

姓名 团体 定量_1 定量_2
姓名1 G1 20 10
姓名1 G2 32 17
姓名1 G3 46 26
名称2 G1 11 6
名称2 G2 24 14
名称2 G3 39 24

如何根据这些条件获得这些列的总和? 预先感谢您的帮助。

oracle group-by sum oracle19c
1个回答
0
投票

使用条件聚合聚合为列,然后

UNPIVOT
列聚合为行:

SELECT *
FROM   (
  SELECT name,
         SUM(CASE WHEN category <= 2 THEN quant_1 END) AS g1_q1,
         SUM(CASE WHEN category <= 2 THEN quant_2 END) AS g1_q2,
         SUM(CASE WHEN category <= 4 THEN quant_1 END) AS g2_q1,
         SUM(CASE WHEN category <= 4 THEN quant_2 END) AS g2_q2,
         SUM(CASE WHEN category <= 6 THEN quant_1 END) AS g3_q1,
         SUM(CASE WHEN category <= 6 THEN quant_2 END) AS g3_q2
  FROM   table_name
  GROUP BY name
)
UNPIVOT (
  (quant_1, quant_2) FOR grp IN (
    (g1_q1, g1_q2) AS 'G1',
    (g2_q1, g2_q2) AS 'G2',
    (g3_q1, g3_q2) AS 'G3'
  )
)

对于样本数据:

CREATE TABLE table_name (Name, Category, Quant_1, Quant_2) AS
SELECT 'name1', 1, 10,  5 FROM DUAL UNION ALL
SELECT 'name1', 1, 10,  5 FROM DUAL UNION ALL
SELECT 'name2', 2, 11,  6 FROM DUAL UNION ALL
SELECT 'name1', 3, 12,  7 FROM DUAL UNION ALL
SELECT 'name2', 4, 13,  8 FROM DUAL UNION ALL
SELECT 'name1', 5, 14,  9 FROM DUAL UNION ALL
SELECT 'name2', 6, 15, 10 FROM DUAL UNION ALL
SELECT 'name1', 7, 20, 20 FROM DUAL;

输出:

姓名 玻璃钢 QUANT_1 QUANT_2
姓名1 G1 20 10
姓名1 G2 32 17
姓名1 G3 46 26
名称2 G1 11 6
名称2 G2 24 14
名称2 G3 39 24

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.