我想捕获每个数字的总和,但是不确定如何从几个具有不同“ WHERE”条件的查询(同一表中的所有数据)中收集所有结果。
例如,
第一个查询:
SELECT * FROM tbl
WHERE tbl.from IN ('NIVA', 'TIRB', 'RIFG', 'PWDF')
AND tbl.send_date > TRUNC(SYSDATE) - 30
GROUP BY tbl.job_nbr;
第二次查询:
SELECT * FROM tbl
WHERE tbl.from IN ('GGGB','GVCE','GMWA','GTYR')
AND tbl.to IN ('GGGBP2','GVCEP3','GMWAP1','GTYRP3')
AND tbl.send_date > TRUNC(SYSDATE) - 30
GROUP BY tbl.job_nbr;
我不确定仅使用WHERE子句是否可以满足我的要求
WHERE tbl.from IN ('NIVA', 'TIRB', 'RIFG', 'PWDF')
AND tbl.from IN ('GGGB','GVCE','GMWA','GTYR')
AND tbl.to IN ('GGGBP2','GVCEP3','GMWAP1','GTYRP3')
让我感到困惑的是,第一个查询产生的结果不需要满足第二个查询的第一个AND运算符条件。似乎如果我将所有列出的值都包含在'tbl.from IN'条件中并使用AND运算符('tbl.to IN'),则返回的结果将仅是'tbl.from IN'条件中列出的结果带有“ tbl.to IN”列。
这两个查询显然会产生单独的结果,但是我想合并结果集,以便我可以按唯一作业编号(tbl.job_nbr)分组计算所有出现的次数。
*注意:我也有点担心性能,因为我想将其合并到更大的查询中。
我确定它有些简单,或者至少有些简单,但是我花了很多时间试图解决这个问题。如果有人愿意帮助我,我将不胜感激!
如果我的解释不够清楚,或者有人有其他问题,我会尽力澄清。
答案 0 :(得分:0)
我认为您需要条件聚合:
SELECT tbl.job_nbr,
SUM(CASE WHEN tbl.from IN ('NIVA', 'TIRB', 'RIFG', 'PWDF')
THEN 1 ELSE 0
END) as cnt1,
SUM(CASE WHEN tbl.from IN ('GGGB', 'GVCE', 'GMWA', 'GTYR') AND
AND tbl.to IN ('GGGBP2', 'GVCEP3', 'GMWAP1', 'GTYRP3')
THEN 1 ELSE 0
END) as cnt2
FROM tbl
WHERE tbl.from IN ('NIVA', 'TIRB', 'RIFG', 'PWDF')
AND tbl.send_date > TRUNC(SYSDATE) - 30
GROUP BY tbl.job_nbr;
答案 1 :(得分:0)
使用case when
,我的意思是条件聚合:
select tbl.job_nbr,
sum(case when tbl.from IN ('NIVA', 'TIRB', 'RIFG', 'PWDF') then 1 else 0 end)
as firstquery_count,
sum(case when tbl.to IN ('GGGBP2','GVCEP3','GMWAP1','GTYRP3' then 1 else 0 end)
as secondndtquery_count
from tbl where tbl.send_date > TRUNC(SYSDATE) - 30
group by tbl.job_nbr
从评论看来,您希望同时添加两个计数,以便可以使用cte
with cte as
(
select tbl.job_nbr,
sum(case when tbl.from IN ('NIVA', 'TIRB', 'RIFG', 'PWDF') then 1 else 0 end)
as firstquery_count,
sum(case when tbl.to IN ('GGGBP2','GVCEP3','GMWAP1','GTYRP3' then 1 else 0 end)
as secondndtquery_count
from tbl where tbl.send_date > TRUNC(SYSDATE) - 30
group by tbl.job_nbr
) select job_nbr,firstquery_count+secondndtquery_count as total
from cte
但是使用cte,您可以对第一查询执行相同的操作,只需使用两个计数的和即可
答案 2 :(得分:0)
据我了解,您需要1个计数器,因此将条件与OR
结合起来:
SELECT tbl.job_nbr, COUNT(*) counter FROM tbl
WHERE
tbl.send_date > TRUNC(SYSDATE) - 30
AND
(
tbl.from IN ('NIVA', 'TIRB', 'RIFG', 'PWDF')
OR (
tbl.from IN ('GGGB','GVCE','GMWA','GTYR')
AND
tbl.to IN ('GGGBP2','GVCEP3','GMWAP1','GTYRP3')
)
)
GROUP BY tbl.job_nbr;