按分组结果进行分组并为所有结果添加组

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

我想在查询中使用表达式组来创建组,同时也创建一个组“all”,其中添加了所有实例。 该代码只是一个示例来展示我想要做什么,可能的语法错误无关紧要。

select (*)
from table
where id in ('a','b','c','d','e','f')
group by case 
when id in ('a','d') then '1'
when id in ('b','e') then '2'
when id in ('c','f') then '3'
when id in ('a','b','c','d','e','f') then 'all'
end

result
1,...
2,...
3,...

wanted result
1,...
2,...
3,...
all,...
sql oracle group-by
1个回答
0
投票

使用

CASE
表达式、聚合和
ROLLUP
:

SELECT COALESCE(
         CASE 
         WHEN id IN ('a','d') THEN '1'
         WHEN id IN ('b','e') THEN '2'
         WHEN id IN ('c','f') THEN '3'
         END,
         'all'
       ) AS grp,
       SUM(value) AS total_value
FROM   table_name
WHERE  id IN ('a','b','c','d','e','f')
GROUP BY
       ROLLUP(
         CASE 
         WHEN id IN ('a','d') THEN '1'
         WHEN id IN ('b','e') THEN '2'
         WHEN id IN ('c','f') THEN '3'
         END
       )

对于样本数据:

CREATE TABLE table_name (id, value) AS
SELECT 'a', 1 FROM DUAL CONNECT BY LEVEL <= 10 UNION ALL
SELECT 'b', 1 FROM DUAL CONNECT BY LEVEL <=  7 UNION ALL
SELECT 'c', 1 FROM DUAL CONNECT BY LEVEL <=  3 UNION ALL
SELECT 'd', 1 FROM DUAL CONNECT BY LEVEL <=  5 UNION ALL
SELECT 'e', 1 FROM DUAL CONNECT BY LEVEL <=  2 UNION ALL
SELECT 'f', 1 FROM DUAL CONNECT BY LEVEL <=  9 UNION ALL
SELECT 'g', 1 FROM DUAL CONNECT BY LEVEL <= 23;

输出:

玻璃钢 TOTAL_VALUE
1 15
2 9
3 12
全部 36

小提琴

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