如何将 Multiple select Query 转换为 Oracle 中的 Case 语句
How to convert the Multiple select Query into Case Statement in Oracle
我有 3 select 个查询,
select *
from PERSON
where person_status_id in (8) and updated_on > sysdate - 30;
select *
from PERSON
where person_status_id in (5, 7, 13) and updated_on > sysdate - 30;
select *
from PERSON
where person_status_id in (3, 4, 6) and updated_on > sysdate - 30
我只想在单个查询中计算 3 个查询的计数,所以我将查询转换如下,
select distinct
v.cnt as "Completed",
p.cnt as "Pending",
s.cnt as "Started"
from
(select 1 as x, count(*) as cnt
from PERSON w
where person_status_id in (3, 4, 6)
and w.UPDATED_ON > (sysdate - 30)) v
inner join
(select 1 as x, count(*) as cnt
from PERSON w
where person_status_id in (5, 7, 13)
and w.UPDATED_ON > (sysdate - 30)) p on v.x = p.x
inner join
(select 1 as x, count(*) as cnt
from PERSON w
where person_status_id in (8)
and w.UPDATED_ON > (sysdate - 30)) s on p.x = s.x;
上述使用联接的查询按预期工作。它 returns 已完成、未决和已开始的计数。
现在我想转换成 case 语句。
select sum(case when person_status_id in (3,4,6) then (select 1 as x, count(*) as cnt from PERSON w and w.UPDATED_ON> (sysdate-30) )v end) as Completed,
sum(case when person_status_id in (5,7,13) then (select 1 as x, count(*) as cnt from PERSON w and w.UPDATED_ON> (sysdate-30) )p end) as Pending,
sum(case when person_status_id in (8) then (select 1 as x, count(*) as cnt from PERSON w and w.UPDATED_ON> (sysdate-30) )s end) as Started
from PERSON w;
这显示“缺少右括号”错误。请纠正我错误的地方。提前致谢。
听起来您只需要对整个 table 进行单次条件聚合。 person_status_id
的限制属于 CASE
表达式,而 updated_on
的限制可以放在 WHERE
子句中,因为它在所有聚合中共享。
SELECT
COUNT(CASE WHEN person_status_id = 8 THEN 1 END) AS Completed,
COUNT(CASE WHEN person_status_id IN (5, 7, 13) THEN 1 END) AS Pending,
COUNT(CASE WHEN person_status_id IN (3, 4, 6) THEN 1 END) AS Started
FROM PERSON
WHERE updated_on > sysdate - 30;
我有 3 select 个查询,
select *
from PERSON
where person_status_id in (8) and updated_on > sysdate - 30;
select *
from PERSON
where person_status_id in (5, 7, 13) and updated_on > sysdate - 30;
select *
from PERSON
where person_status_id in (3, 4, 6) and updated_on > sysdate - 30
我只想在单个查询中计算 3 个查询的计数,所以我将查询转换如下,
select distinct
v.cnt as "Completed",
p.cnt as "Pending",
s.cnt as "Started"
from
(select 1 as x, count(*) as cnt
from PERSON w
where person_status_id in (3, 4, 6)
and w.UPDATED_ON > (sysdate - 30)) v
inner join
(select 1 as x, count(*) as cnt
from PERSON w
where person_status_id in (5, 7, 13)
and w.UPDATED_ON > (sysdate - 30)) p on v.x = p.x
inner join
(select 1 as x, count(*) as cnt
from PERSON w
where person_status_id in (8)
and w.UPDATED_ON > (sysdate - 30)) s on p.x = s.x;
上述使用联接的查询按预期工作。它 returns 已完成、未决和已开始的计数。
现在我想转换成 case 语句。
select sum(case when person_status_id in (3,4,6) then (select 1 as x, count(*) as cnt from PERSON w and w.UPDATED_ON> (sysdate-30) )v end) as Completed,
sum(case when person_status_id in (5,7,13) then (select 1 as x, count(*) as cnt from PERSON w and w.UPDATED_ON> (sysdate-30) )p end) as Pending,
sum(case when person_status_id in (8) then (select 1 as x, count(*) as cnt from PERSON w and w.UPDATED_ON> (sysdate-30) )s end) as Started
from PERSON w;
这显示“缺少右括号”错误。请纠正我错误的地方。提前致谢。
听起来您只需要对整个 table 进行单次条件聚合。 person_status_id
的限制属于 CASE
表达式,而 updated_on
的限制可以放在 WHERE
子句中,因为它在所有聚合中共享。
SELECT
COUNT(CASE WHEN person_status_id = 8 THEN 1 END) AS Completed,
COUNT(CASE WHEN person_status_id IN (5, 7, 13) THEN 1 END) AS Pending,
COUNT(CASE WHEN person_status_id IN (3, 4, 6) THEN 1 END) AS Started
FROM PERSON
WHERE updated_on > sysdate - 30;