我正在尝试从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
答案 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的两个不同的选择语句