将 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');
排序
首先,如果这看起来很微不足道,我深表歉意,但我已经自己尝试了一段时间,但收效甚微,因此寻求帮助。下面是 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');
排序