簡體   English   中英

ORACLE-如何計算來自同一表的兩個查詢的總數(具有不同的WHERE子句)?

[英]ORACLE - How to count the total of two queries(with different WHERE clauses) from same table?

我想捕獲每個數字的總和,但是不確定如何從具有不同“ 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)來對所有出現的次數進行分組。

*注意:我也有點擔心性能,因為我想合並到更大的查詢中。

我確信它有些簡單,或者至少有些簡單,但是我花了很多時間試圖解決這個問題。 如果有人願意幫助我,我將不勝感激!

如果我的解釋不夠清楚,或者有人有其他問題,我會盡力澄清。

我認為您需要條件聚合:

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;

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,您可以對第一查詢執行相同的操作,只需使用兩個計數的和

據我了解,您需要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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM