ORACLE - Как подсчитать сумму двух запросов (с разными предложениями WHERE) из одной таблицы? - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу получить совокупность каждого числа, но не уверен, как собрать все результаты из пары запросов (все данные из одной таблицы), которые имеют разные критерии «ГДЕ».

Например,

1-й запрос:

SELECT * FROM tbl
WHERE tbl.from IN ('NIVA', 'TIRB', 'RIFG', 'PWDF')
AND tbl.send_date > TRUNC(SYSDATE) - 30
GROUP BY tbl.job_nbr;

2-й запрос:

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')

Я запутался в том, что результаты, полученные по моему 1-му запросу, не должны удовлетворять условию 1-го оператора AND 2-го запроса.Кажется, если я включу все свои перечисленные значения в условие «tbl.from IN» и использую оператор AND («tbl.to IN»), то возвращаемые результаты будут только теми, которые перечислены в условии «tbl.from IN»со столбцом «tbl.to IN».

Очевидно, что оба запроса дают отдельные результаты, но я хочу объединить набор результатов, чтобы я мог сосчитать все вхождения, с уникальным номером задания GROUP'ED BY (tbl.job_nbr).

* Примечание: я также немного обеспокоен производительностью, потому что хочу включить в более крупный запрос.

Я уверен, что это что-то простое или, по крайней мере, несколько простое,но я потратил много времени, пытаясь понять это.Если кто-то будет достаточно любезен, помогите мне, я буду очень признателен!

Если я недостаточно четко объяснил или у кого-то возникли дополнительные вопросы, я сделаю все возможное, чтобы уточнить.

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

использовать 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 youможет сделать то же самое с 1-м запросом, просто добавив эти два числа

0 голосов
/ 07 февраля 2019

Насколько я понимаю, вам нужен 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;
0 голосов
/ 07 февраля 2019

Я думаю, вы хотите условное агрегирование:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...