如何构建SQL查询以显示两列不同的日期范围?

时间:2011-11-09 10:28:50

标签: sql oracle select oracle11g

我正在尝试从Oracle 11g数据库构建查询以在报告中使用。我需要使用两个表CONTACT和CONTACT_EXT来获取数据,并比较两个日期范围内的联系人总数。这些表通过ID的匹配加入。

联系:

ID | DATE
----------
1   12/12/2010
2   12/11/2010
3   14/09/2011

CONTACT_EXT

 ID | TYPE
----------
1   MAIL
2   FAX
3   FAX  

例如,如果我将期间A设定为2010年1月1日至2010年12月12日期间,且期间B为01/01/2011至11/11/2011期间

TYPE | PERIOD A | PERIOD B | TOTAL
MAIL   1          0          1
FAX    1          1          2

3 个答案:

答案 0 :(得分:3)

SQL> create table contact (id,cdate)
  2  as
  3  select 1, date '2010-12-12' from dual union all
  4  select 2, date '2010-11-12' from dual union all
  5  select 3, date '2011-09-14' from dual
  6  /

Table created.

SQL> create table contact_ext (id,type)
  2  as
  3  select 1, 'MAIL' from dual union all
  4  select 2, 'FAX' from dual union all
  5  select 3, 'FAX' from dual
  6  /

Table created.

SQL> select ce.type
  2       , count(case when c.cdate between date '2010-01-01' and date '2010-12-12' then 1 end) period_a
  3       , count(case when c.cdate between date '2011-01-01' and date '2011-11-11' then 1 end) period_b
  4       , count(*) total
  5    from contact c
  6         inner join contact_ext ce on (c.id = ce.id)
  7   group by ce.type
  8  /

TYPE   PERIOD_A   PERIOD_B      TOTAL
---- ---------- ---------- ----------
FAX           1          1          2
MAIL          1          0          1

2 rows selected.

的问候,
罗布。

答案 1 :(得分:1)

做一个自我加入:

select type,period_a,period_b,period_a+period_b as total
from(
  select type,count(1) as period_a
  from contact_ext
  left join contact
  using(id)
  where date>='20100101' and date<='20101212'
  group by 1
)a
join(
  select type,count(1) as period_b
  from contact_ext
  left join contact
  using(id)
  where date>='20110101' and date<='20111111'
  group by 1
)b
using(type);

答案 2 :(得分:0)

答案1:在2010年1月1日至2010年12月12日期间的子句设定期间A或2011年1月1日至2011年11月11日期间的期间B 在where子句中使用OR条件

答案2:您可以结合期间A和期间B的两个不同的选择语句