将 3 x sql 对 oracle 数据库的查询合并为 1

Combine 3 x sql queries on oracle db into 1

首先,如果这看起来很微不足道,我深表歉意,但我已经自己尝试了一段时间,但收效甚微,因此寻求帮助。下面是 3 x sql 查询(第 1、2、3 点),我想将它们合并为一个查询,给出第 4 点中显示的输出。(RDATE、CODATE、COMDATE 是 Table 中的列“ ORTABLE" 并且类型为 'DATE',格式为 mm/dd/yyyy。STATUS 也是 table 中的列之一,并且具有不同的状态值,在这些值上放置过滤器以获取后续计数并按月排序。

select to_char(RDATE, 'MON RRRR') AS MONTH,
       COUNT(STATUS) as "NEW" 
from ORTABLE 
GROUP BY to_char(RDATE, 'MON RRRR'), to_char(RDATE, 'RRRR MM') 
order by to_char(RDATE, 'RRRR MM');

Output
MONTH              NEW
MAR 2020          19
APR 2020            76
MAY 2020           33
JUN 2020            18
JUL 2020             27
AUG 2020           82
SEP 2020             29
OCT 2020            25
NOV 2020           53
DEC 2020            1
JAN 2021            40
FEB 2021            4

select to_char(CODATE, 'MON RRRR') AS MONTH,
       COUNT(STATUS) as "STATUSANB" 
from ORTABLE where STATUS IN ('STATUSA','STATUSB') 
GROUP BY to_char(CODATE, 'MON RRRR'), to_char(CODATE, 'RRRR MM') 
order by to_char(CODATE, 'RRRR MM') ;

Output
MONTH      STATUSANB
SEP 2020    9
OCT 2020    12
NOV 2020    2
DEC 2020    1
JAN 2021    39
FEB 2021    1

select to_char(COMDATE , 'MON RRRR') AS MONTH,
       COUNT(STATUS) as "Completed" 
from ORTABLE 
where STATUS IN ('STATUSC','STATUSD','STATUSE') 
GROUP BY to_char(COMDATE , 'MON RRRR'),to_char(COMDATE , 'RRRR MM') 
order by to_char(COMDATE , 'RRRR MM') ;

Output
MONTH   Completed
APR 2020    1
MAY 2020    71
JUN 2020    48
JUL 2020    34
AUG 2020    37
SEP 2020    19
OCT 2020    62
NOV 2020    3
DEC 2020    42
JAN 2021    23
FEB 2021    1

我希望得到 sql 查询,这样我就可以得到以下格式的数据

Month      NEW   STATUSANB      Completed
MAR 2020    19      
APR  2020   76                    1
MAY 2020    33                    71
JUN 2020    18                    48
JUL 2020    27                    34
AUG 2020    82                    37
SEP 2020    29         9           19
OCT 2020    25        12           62
NOV 2020    53         2           3
DEC 2020    1          1           42
JAN 2021    40        39           23
FEB 2021    4          1           1

如果有人能抽出一些时间和建议,那就是 appreciated.Thanks。 附加图像以更好地理解 3x 查询的输出和预期的组合输出 3xsql queries output and desired output

使用条件聚合并将所有 3 个查询合并为一个:

SELECT
    TO_CHAR(RDATE, 'MON RRRR') AS MONTH,
    COUNT(STATUS) AS "NEW",
    COUNT(CASE WHEN STATUS IN ('STATUSA', 'STATUSB') THEN 1 END) AS STATUSANB,
    COUNT(CASE WHEN STATUS IN ('STATUSC', 'STATUSD', 'STATUSE') THEN 1 END) AS Completed
FROM ORTABLE
GROUP BY
    TO_CHAR(RDATE, 'MON RRRR')
ORDER BY
    TO_CHAR(RDATE, 'MON RRRR');

您有不同的日期列。处理此问题的一种方法是使用 union all 然后聚合。作为一个偏好问题,我更喜欢 trunc() 而不是将日期转换为字符串,所以我将使用它:

select trunc(dte, 'MON'),
       sum(is_new), sum(is_anb), sum(is_completed)
from ((select rdate as dte, 1 as is_new, null as is_anb, null as is_completed
       from ORTABLE
      ) union all
      (select codate as dte, null as is_new, 1, null
       from ORTABLE
       where STATUS IN ('STATUSA', 'STATUSB')
      ) union all
      (select comdate, null, null as is_new, 1 as is_completed
       from ORTABLE
       where STATUS IN ('STATUSC', 'STATUSD', 'STATUSE') 
      ) 
     ) d
group by trunc(dte, 'MON')
order by trunc(dte, 'MON');

感谢您对我的菜鸟 table 格式发布的所有回复和编辑.. 下面的查询排序 me.I 尝试使用 MON/YYYY 格式,但由于月份格式的字符串它会扭曲排序 order.Unless 有更好的方法来执行我将要使用的 MON 排序格式使用 MM/YY 格式..

select to_char(dte, 'MM/YY') ,
   sum(is_new) , sum(is_anb) , sum(is_completed) 

from ((select rdate as dte, 1 as is_new, null as is_anb, null as is_completed 来自 ORTABLE ) 联合所有 (select 编码为 dte,null 为 Enter,1,null 来自 ORTABLE 其中状态在 ('STATUSA', 'STATUSB') ) 联合所有 (select comdate, null, null as Enter, 1 as Completed 来自 ORTABLE 其中 STATUS IN ('STATUSC', 'STATUSD', 'STATUSE') ) ) d 按 to_char(dte, 'MM/YY'),to_char(dte, 'YY/MM') 分组 按 to_char(dte, 'YY/MM');

排序