Есть ли способ присоединиться к ниже 2 запросов - PullRequest
0 голосов
/ 06 февраля 2020

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

В этом запросе я проверяю для записей, представленных в таблице 1, которые удовлетворяют условию m1.condition, равно 1, и для этой записи выполняется запрос к таблице 2, где даже через 5 минут нет записи в таблице 2, затем получите количество этих записей.

Проверка даты, которую вы видите в течение 30 минут, заключается в получении всех записей в таблице, которые обрабатываются за полчаса до этого.

SELECT count(*) AS TOTALCOUNT, 
       SELECT TO_CHAR(amount, '$999,999,999,999,999.99') AS TOTALVALUE 
from table1 m1 
LEFT JOIN table2 m ON m.id=m1.id 
where m1.condition='1' 
  and amount BETWEEN 1000 and 25000 
  and (m1.DATE <= (select to_char((select systimestamp - interval '0 00:05' day to minute from dual),'dd-MON-yy HH.MI.SS AM TZD') from dual)) 
  and m1.DATE <= (select to_char((select systimestamp - interval '0 00:30' day to minute from dual),'dd-MON-yy HH.MI.SS AM TZD') from dual) 
  and m1.DATE <= systimestamp

аналогично приведенному ниже запросу в таблице 2 существуют некоторые условия. ... на основании этого я выполняю некоторые действия.

SELECT COALESCE(SUM (CASE when m.f = 'Converted' then 1 else 0 END),0) AS CCOUNT, 
       COALESCE(SUM (CASE when m.f = 'Do Not Convert' then 1 else 0 END),0) AS NCOUNT, 
       count(m. id) AS TOTALCOUNT, 
       TO_CHAR(COALESCE (SUM(CASE when m.f = 'C' then (amount) END),0), '$999,999,999,999,999.99') AS CONVERTED, 
       TO_CHAR(COALESCE (SUM(CASE when m.f = 'D' then (amount) END),0), '$999,999,999,999,999.99') AS NONCONVERTED, 
       TO_CHAR(COALESCE (SUM(CASE when m.f <> '0' then (amount) END),0), '$999,999,999,999,999.99') AS TOTAL 
FROM table1 ml 
JOIN table2 m ON m.id=ml.id 
             and amount BETWEEN 1000 and 25000 
             and m1.DATE <= (select to_char((select systimestamp - interval '0 30:00' day to minute from dual),'dd-MON-yy HH.MI.SS AM TZD') from dual) 
             and m1.DATE < systimestamp;

Мне нужно объединить оба вышеупомянутых запроса ... но я не могу сделать.

1 Ответ

0 голосов
/ 06 февраля 2020

Единственная реальная разница между фильтрами заключается в том, что m1.condition = '1', поэтому просто добавьте

   count(case condition when '1' then 1 end) as condition_1_totalcount, 
   sum(case condition when '1' then amount end) as condition_1_totalvalue 

во второй запрос. В моем коротком тесте все выглядит хорошо:

-- sample data
with 
  table1(id, date_, condition) as (
    select 1, date '1990-02-19', '1' from dual union all
    select 2, date '1990-02-19', '7' from dual union all
    select 3, date '1990-02-19', '1' from dual union all
    select 4, date '1990-02-19', '1' from dual ),
  table2(id, f, amount) as (
    select 1, 'C', 3000 from dual union all
    select 2, 'D', 3500 from dual union all
    select 3, 'D', 4000 from dual union all
    select 4, 'D', 5000 from dual )

-- query
select sum (case when m.f = 'Converted' then 1 else 0 end) ccount, 
       sum (case when m.f = 'Do Not Convert' then 1 else 0 end) as ncount, 
       count(m.id) as totalcount, 
       sum(case when m.f = 'C' then (amount) end) as converted, 
       sum(case when m.f = 'D' then (amount) end) as nonconverted, 
       sum(case when m.f <> '0' then (amount) end) as total,
       count(case condition when '1' then 1 end) as condition_1_totalcount, 
       sum(case condition when '1' then amount end) as condition_1_totalvalue 
  from table1 ml
  join table2 m on m.id = ml.id 
  where ml.date_ <= systimestamp - interval '30' minute
    and amount between 1000 and 25000 

Я не до конца понимаю, почему эта 5 min часть в первом запросе. Строки старше 30 минут также старше 5 минут, поэтому, как указано в комментариях, это излишне. И старше текущей отметки времени. Если вам нужно дифференцировать значения таким образом, вы также можете поместить это условие в case when s.

...