[英]How to combine two queries from same DB with different where clauses?
[英]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.