ORACLE-如何计算来自同一表的两个查询的总数(具有不同的WHERE子句)?

时间:2019-02-07 17:48:05

标签: sql oracle oracle11g

我想捕获每个数字的总和,但是不确定如何从几个具有不同“ 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)分组计算所有出现的次数。

*注意:我也有点担心性能,因为我想将其合并到更大的查询中。

我确定它有些简单,或者至少有些简单,但是我花了很多时间试图解决这个问题。如果有人愿意帮助我,我将不胜感激!

如果我的解释不够清楚,或者有人有其他问题,我会尽力澄清。

3 个答案:

答案 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;