性格いい人が優勝

下記のようなテーブルから
ユニークなデータの件数を取り出すクエリを作成したいのですが、どうもわかりません。
教えてください!宜しくお願い致します。

NO | CD1 | DATE1 | CD2 | DATE2 | CD3 | DATE3
1 111 20120301 222 20130301 333 20130303
2 111 20120301 222 20130301 333 20130303
3 222 20120301 333 20130301
4 222 20120301 333 20130301
5 333 20120301 444 20130301 555 20130302
6 333 20120301 444 20130301 555 20130303
7 333 20120301
8 333 20120302

というテーブルがあって、

この中で
DATE1、DATE2、DATE3のいずれかが、
同じであれば、行を取り出しカウントする。
1項目しかデータがなければ、単純にカウントする。
取り出しはCDのみ。

上記であれば、

COUNT | CD1 | CD2 | CD3
2 111 222 333
2 222 333
2 333 444     ※こちらはDATE3が異なるのでCD3は取り出さない。
2 333

A 回答 (1件)

NOが主キー、CDとDATEはCD1・DATE1から順に設定されていくという前提で、



select COUNT(*), CD1, CD2, CD3
from (
--DATE1、DATE2、DATE3の全てが一致
select T1.CD1, T1.CD2, T1.CD3
from T T1
where exists (
select * from T T2
where T1.NO <> T2.NO
and (T1.CD1 = T2.CD1 and T1.DATE1 = T2.DATE1)
and (T1.CD2 = T2.CD2 and T1.DATE2 = T2.DATE2)
and (T1.CD3 = T2.CD3 and T1.DATE3 = T2.DATE3)
)
union all
--DATE1、DATE2のみが一致
select T1.CD1, T1.CD2, null
from T T1
where exists (
select * from T T2
where T1.No <> T2.NO
and (T1.CD1 = T2.CD1 and T1.DATE1 = T2.DATE1)
and (T1.CD2 = T2.CD2 and T1.DATE2 = T2.DATE2)
and ((T1.CD3 is null and T2.CD3 is null) or ((T1.CD3 = T2.CD3) and ((T1.DATE3 <> T2.DATE3))))
)
union all
--DATE1のみしかデータがない
select T1.CD1, null, null
from T T1
where T1.CD2 is null
)
group by CD1, CD2, CD3;

とか。
やりたいことを正しく理解できているか分かりませんが。
    • good
    • 0
この回答へのお礼

ありがとうございました。バッチリです。

お礼日時:2013/03/22 18:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!