2011-11-09 6 views
1

レポートで使用するためにOracle 11gデータベースからクエリを作成しようとしています。 2つのテーブルCONTACTとCONTACT_EXTを使用してデータを取得し、2つの日付範囲にわたる連絡先の合計を比較する必要があります。テーブルはIDの一致によって結合されます。異なる日付範囲の2つの列を表示するSQLクエリを作成するにはどうすればよいですか?

CONTACT:

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

CONTACT_EXT

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

だから01の間であることが2010年1月1日と2010年12月12日及び期間Bの間になるように、期間Aを設定した場合、例えば/ 2011/01、2011年11月11日

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

答えて

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); 
+0

私はこれをテストしましたが、それは私が欲しかった正確に機能しました、ありがとうございます! – Alan

+0

大歓迎です。 :) –

+0

私は、このクエリが各テーブルを2回訪問しなければならないので、必要以上に機能することを指摘したいと思います。 –

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. 

よろしく、
Rob。

+0

の二つの異なるselect文をすることができます期間Bには値がありますが、期間Aには値がありません(つまり、行は返されません)。 この問題の1つは、値が重複している値で「ダブルカウント」されるため、合計が間違っていることです。 – Gribbler

0

回答1:のWHERE句設定期間A 2011年1月1日と11の間に2010年1月1日と2010年12月12日OR期間Bの間に/ where句の使用OR条件で11/2011

答2:あなたは受け入れ答えはどこのケースを処理しないように、これは、実際には正解である労働組合期間Aと期間B

関連する問題