Oracle SQL как написать сложный запрос с несколькими объединениями и групповым - PullRequest
0 голосов
/ 09 марта 2020

Oracle SQL: у меня есть следующий набор запросов, все выборки из одной таблицы. Я хотел выяснить, есть ли способ объединить все это в один запрос?

SELECT COUNT(T.ISSUE_NUMBER) total_cases,
       COUNT(CASE WHEN T.DIST_COMPLETED_STATUS = 'Closed' THEN 1 END) total_close,
       COUNT(CASE WHEN T.DIST_COMPLETED_STATUS = 'Open' THEN 1 END) total_open,
       COUNT(CASE WHEN T.IS_DUPLICATE = 1 THEN 1 END) total_duplicate,
       COUNT(CASE WHEN T.IS_REJECTION = 1 THEN 1 END) total_rejected,
       T.G_SECTOR 
FROM TRANSFORMED T
WHERE T.SERVICE_CENTER_ENGLISH = 'Center' 
AND TO_DATE(T.RAISED_ON)  >= TRUNC(SYSDATE)-30
AND T.IS_DISTORTION = 1
GROUP BY T.G_SECTOR 
ORDER BY 1 DESC

SELECT COUNT(T.ISSUE_NUMBER) total_cases,
       COUNT(CASE WHEN T.DIST_COMPLETED_STATUS = 'Closed' THEN 1 END) total_close,
       COUNT(CASE WHEN T.DIST_COMPLETED_STATUS = 'Open' THEN 1 END) total_open,
       COUNT(CASE WHEN T.IS_DUPLICATE = 1 THEN 1 END) total_duplicate,
       COUNT(CASE WHEN T.IS_REJECTION = 1 THEN 1 END) total_rejected,
       T.AGENCY_NAME,T.DIST_AGENCY_TYPE
FROM TRANSFORMED T
WHERE T.SERVICE_CENTER_ENGLISH = 'Center' 
AND TO_DATE(T.RAISED_ON)  >= TRUNC(SYSDATE)-30
AND T.IS_DISTORTION = 1
GROUP BY T.AGENCY_NAME, T.DIST_AGENCY_TYPE
ORDER BY 1 DESC

SELECT COUNT(T.ISSUE_NUMBER) total_cases,
       COUNT(CASE WHEN T.DIST_COMPLETED_STATUS = 'Closed' THEN 1 END) total_close,
       COUNT(CASE WHEN T.DIST_COMPLETED_STATUS = 'Open' THEN 1 END) total_open,
       COUNT(CASE WHEN T.IS_DUPLICATE = 1 THEN 1 END) total_duplicate,
       COUNT(CASE WHEN T.IS_REJECTION = 1 THEN 1 END) total_rejected,
       T.VIOLATION_ENGLISH,T.DIST_AGENCY_TYPE
FROM TRANSFORMED T
WHERE T.SERVICE_CENTER_ENGLISH = 'Center' 
AND TO_DATE(T.RAISED_ON)  >= TRUNC(SYSDATE)-30
AND T.IS_DISTORTION = 1
GROUP BY T.VIOLATION_ENGLISH, T.DIST_AGENCY_TYPE
ORDER BY 1 DESC

Ответы [ 3 ]

0 голосов
/ 09 марта 2020

Да, Oracle имеет расширенные механизмы для группировки данных: Функции ROLLUP, CUBE, GROUPING и SETING GROUP SETS . В вашем случае группировка наборов кажется многообещающей.

Это моя таблица:

create table t(a, b, c, d, e, f) as (
    select 'A1', 'B1', 'C1', 'D1', 'E1', 701 from dual union all
    select 'A2', 'B1', 'C2', 'D1', 'E2', 702 from dual union all
    select 'A2', 'B1', 'C2', 'D1', 'E3', 703 from dual );

Ваши запросы отличаются только в части group by, и вы, естественно, выбираете разные столбцы, которые являются базой групп , where условия и условные подсчеты не важны. Ваш выбор выглядит следующим образом:

 select a, count(1) from t group by a;

 select b, c, count(1) from t group by b, c;

 select d, e, count(1) from t group by d, e;

Вы можете сделать это:

select a, b, c, d, e, grouping_id(a, b, c, d, e) grp_id, count(1) cnt 
  from t 
  group by grouping sets( (a, null), (b, c), (d, e) )

, который выводит:

A  B  C  D  E      GRP_ID        CNT
-- -- -- -- -- ---------- ----------
A1                     15          1
A2                     15          2
   B1 C1               19          1
   B1 C2               19          2
         D1 E1         28          1
         D1 E2         28          1
         D1 E3         28          1
0 голосов
/ 09 марта 2020

GROUPING SETS должен делать то, что вы хотите:

SELECT T.G_SECTOR, T.AGENCY_NAME, T.DIST_AGENCY_TYPE,
       T.VIOLATION_ENGLISH, T.DIST_AGENCY_TYPE,
       COUNT(T.ISSUE_NUMBER) as total_cases,
       COUNT(CASE WHEN T.DIST_COMPLETED_STATUS = 'Closed' THEN 1 END) as total_close,
       COUNT(CASE WHEN T.DIST_COMPLETED_STATUS = 'Open' THEN 1 END) as total_open,
       COUNT(CASE WHEN T.IS_DUPLICATE = 1 THEN 1 END) as total_duplicate,
       COUNT(CASE WHEN T.IS_REJECTION = 1 THEN 1 END) as total_rejected
FROM TRANSFORMED T
WHERE T.SERVICE_CENTER_ENGLISH = 'Center' AND
      TO_DATE(T.RAISED_ON)  >= TRUNC(SYSDATE)-30 AND
      T.IS_DISTORTION = 1
GROUP BY GROUPING SETS ( (T.G_SECTOR), 
                         (T.AGENCY_NAME, T.DIST_AGENCY_TYPE),
                         (T.VIOLATION_ENGLISH, T.DIST_AGENCY_TYPE)
                       )
ORDER BY total_cases DESC;
0 голосов
/ 09 марта 2020
SELECT *
FROM (
SELECT COUNT(T.ISSUE_NUMBER) total_cases,
       COUNT(CASE WHEN T.DIST_COMPLETED_STATUS = 'Closed' THEN 1 END) total_close,
       COUNT(CASE WHEN T.DIST_COMPLETED_STATUS = 'Open' THEN 1 END) total_open,
       COUNT(CASE WHEN T.IS_DUPLICATE = 1 THEN 1 END) total_duplicate,
       COUNT(CASE WHEN T.IS_REJECTION = 1 THEN 1 END) total_rejected,
       T.G_SECTOR, '' AS AGENCY_NAME, '' AS VIOLATION_ENGLISH, '' AS DIST_AGENCY_TYPE 
FROM TRANSFORMED T
WHERE T.SERVICE_CENTER_ENGLISH = 'Center' 
AND TO_DATE(T.RAISED_ON)  >= TRUNC(SYSDATE)-30
AND T.IS_DISTORTION = 1
GROUP BY T.G_SECTOR 

UNION ALL    
SELECT COUNT(T.ISSUE_NUMBER) total_cases,
       COUNT(CASE WHEN T.DIST_COMPLETED_STATUS = 'Closed' THEN 1 END) total_close,
       COUNT(CASE WHEN T.DIST_COMPLETED_STATUS = 'Open' THEN 1 END) total_open,
       COUNT(CASE WHEN T.IS_DUPLICATE = 1 THEN 1 END) total_duplicate,
       COUNT(CASE WHEN T.IS_REJECTION = 1 THEN 1 END) total_rejected,
       '' AS G_SECTOR, T.AGENCY_NAME, '' AS VIOLATION_ENGLISH, T.DIST_AGENCY_TYPE
FROM TRANSFORMED T
WHERE T.SERVICE_CENTER_ENGLISH = 'Center' 
AND TO_DATE(T.RAISED_ON)  >= TRUNC(SYSDATE)-30
AND T.IS_DISTORTION = 1
GROUP BY T.AGENCY_NAME, T.DIST_AGENCY_TYPE

UNION ALL    
SELECT COUNT(T.ISSUE_NUMBER) total_cases,
       COUNT(CASE WHEN T.DIST_COMPLETED_STATUS = 'Closed' THEN 1 END) total_close,
       COUNT(CASE WHEN T.DIST_COMPLETED_STATUS = 'Open' THEN 1 END) total_open,
       COUNT(CASE WHEN T.IS_DUPLICATE = 1 THEN 1 END) total_duplicate,
       COUNT(CASE WHEN T.IS_REJECTION = 1 THEN 1 END) total_rejected,
       '' AS G_SECTOR, '' AS AGENCY_NAME, T.VIOLATION_ENGLISH,T.DIST_AGENCY_TYPE
FROM TRANSFORMED T
WHERE T.SERVICE_CENTER_ENGLISH = 'Center' 
AND TO_DATE(T.RAISED_ON)  >= TRUNC(SYSDATE)-30
AND T.IS_DISTORTION = 1
GROUP BY T.VIOLATION_ENGLISH, T.DIST_AGENCY_TYPE
) A
ORDER BY 1 DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...