有没有办法加入下面的两个查询

时间:2020-02-06 06:08:58

标签: sql oracle join left-join

我正在尝试加入下面的2个查询。.尽管下面的两个查询都使用相同的表,但我无法获得正确的结果。

在此查询中,我正在检查满足条件m1的表1中存在的条目.condition为1,并对该表进行查询,其中即使在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 :(得分:0)

过滤器之间唯一真正的区别是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中。