从两个不同的表中加入两个SELECT语句结果

时间:2018-01-02 11:22:21

标签: sql oracle

我正在尝试创建一个代码来连接来自不同表和条件的两个语句,如下所示:

第一个声明:

select TO_CHAR(Entry_date, 'MON.YYYY') AS Months, count(Customer_id) "Count Customer"
from table1
where  entry_date >= TO_DATE('01.01.1900', 'DD.MM.YYYY') 
     AND entry_date <= TO_DATE('31.12.2017', 'DD.MM.YYYY')
     and Customer_status = 'Active'
group by TO_CHAR(entry_date,'MON.YYYY')

order by to_date(TO_CHAR(entry_date, 'MON.YYYY'),'MON.YYYY')

第二个陈述:

select count (order_id) "Order"
from table2
where leave_date >= TO_DATE('01.01.1900', 'DD.MM.YYYY') 
         AND leave_date <= TO_DATE('31.12.2017', 'DD.MM.YYYY')
    group by TO_CHAR(leave_date,'MON.YYYY')

    order by to_date(TO_CHAR(leave_date, 'MON.YYYY'),'MON.YYYY')

结果应如下所示

Months           Count Customer      Order
Jan. 2017              15              0
Feb. 2017              1               8
Mar. 2017              30              10

订单应取决于第一份声明中陈述的月份。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我会把它写成:

select yyyymm, sum(cust_count) as cust_count, sum(num_orders) as num_orders
from ((select to_char(entry_date, 'YYYY-MM') as yyyymm, count(*) as cust_count, 0 as num_orders
       from table1
       where entry_date >= date '1900-01-01' and
             entry_date < date '2018-01-01' and
             Customer_status = 'Active'
      group by to_char(entry_date, 'YYYY-MM')
     ) union all
     (select to_char(leave_date, 'YYYY-MM') as yyyymm, 0,
             count(*) as num_orders
      from table2
      where leave_date >= date '1900-01-01' and 
            leave_date < date '2018-01-31'
      group by to_char(leave_date, 'YYYY-MM')
     )
    ) tt
group by yyyymm
order by yyyymm;

关于一些变化的说明:

  • 使用date而不是to_char()和日期常量。
  • 使用格式&#34; YYYY-MM&#34;,正确订购。 (你不必使用它,但建议使用它。)
  • union all将所有数据汇总在一起。在Oracle中,您也可以使用full outer join,但这需要更多地使用coalesce()