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 |
如何根据这些条件获得这些列的总和? 预先感谢您的帮助。
使用条件聚合聚合为列,然后
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 |