除了所有详细信息行之外,还获取每组的聚合值

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

假设我有以下数据:

服务器 组件 状态
A C1 好的
A C2 好的
B C1 好的
B C2 错误

我想要一个

SELECT
语句,输出详细记录 每个服务器的“小计”,以及
STATUS
列的聚合值(如果至少有一个值是
ERROR
,则它应该阅读
ERROR
)。
由于那里只有
OK
ERROR
出现,因此
MIN()
在这里可以工作。

类似这样的:

服务器 组件 状态
A C1 好的
A C2 好的
A 好的
B C1 好的
B C2 错误
B 错误

我认为这可能可以通过

rollup
grouping sets
实现,但我对这些功能很感兴趣;-)

以下 SELECT 可以作为开始。 ;-)

WITH
   t
   AS
      (SELECT 'A' AS server, 'C1' AS component, 'OK' AS status FROM DUAL
       UNION ALL
       SELECT 'A', 'C2', 'OK' FROM DUAL
       UNION ALL
       SELECT 'B', 'C1', 'OK' FROM DUAL
       UNION ALL
       SELECT 'B', 'C2', 'ERROR' FROM DUAL)
SELECT t.*
  FROM t;
sql oracle
1个回答
0
投票

使用

ROLLUP

SELECT server,
       component,
       MIN(status) AS status
FROM   table_name
GROUP BY ROLLUP(server, component)
HAVING GROUPING_ID(server) = 0
ORDER BY server, component

或:

SELECT server,
       component,
       MIN(status) AS status
FROM   table_name
GROUP BY ROLLUP(server, component)
HAVING GROUPING_ID(server, component) < 3
ORDER BY server, component

对于样本数据:

CREATE TABLE table_name (server, component, status) AS
  SELECT 'A', 'C1', 'OK'    FROM DUAL UNION ALL
  SELECT 'A', 'C2', 'OK'    FROM DUAL UNION ALL
  SELECT 'B', 'C1', 'OK'    FROM DUAL UNION ALL
  SELECT 'B', 'C2', 'ERROR' FROM DUAL;

两个输出:

服务器 组件 状态
A C1 好的
A C2 好的
A 好的
B C1 好的
B C2 错误
B 错误

小提琴

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