- - PR -
テーブルの結合とグループ化について
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2005-03-13 15:32
SQLのテーブルJOINとグループ化について、どうにも意図した結果に
ならず悩んでいます。どうか、ご存知のかた教えてください。 以下のTBL_A,B,Cにおいて、テーブルの結合をして【結果】を得たい のですが、TBL_CのNUM列はID、SUB_IDのが同一なものの中で最大値 を求め、その行のC列を結果に加えたいのです。 ちなみにDBMSはDB2です。説明が足りないかも知れませんが、宜しく お願いいたします。 TBL_A ID A ------- ------- 1 a 2 b 3 c 4 d TBL_B ID SUB_ID B ------- ------- ------- 1 1 aaa 1 2 bbb 2 1 ccc 2 2 ddd 3 1 eee 4 1 fff TBL_C ID SUB_ID NUM C ------- ------- ------- ------- 1 1 1 aaaa 1 1 2 bbbb 1 2 1 cccc 1 2 4 dddd 2 1 4 eeee 2 1 2 ffff 2 2 3 gggg 2 2 2 hhhh 3 1 2 iiii 3 1 4 jjjj 4 1 1 kkkk 4 1 3 llll 【結果】 ID SUB_ID A B NUM C ------- ------- ------- ------- ------- ------- 1 1 a aaa 2 aaaa 1 2 a bbb 4 dddd 2 1 b ccc 4 eeee 2 2 b ddd 3 gggg 3 1 c eee 4 jjjj 4 1 d fff 3 llll (追記)テーブルのSAMPLEが見づらいので編集しました。 [ メッセージ編集済み 編集者: ななな 編集日時 2005-03-13 15:50 ] | ||||
|
投稿日時: 2005-03-13 17:00
とりあえず、どのようなSQLを作ってみたのか貼り付けてみてください。
※いちばんそれっぽくなったもので結構です(1つでも) Cテーブルを、ID、SUB_IDでグループ化してNUMのMAXを取得したものを作成し、普通に結合。 ↓このような構造になるかとおもいます(GROUP BYやWHEREは省略しています) SELECT ... FROM A,B,C, (SELECT ID,SUB_ID,MAX(NUM) AS MAX_NUM FROM C ) AS C_2 | ||||
|
投稿日時: 2005-03-14 10:47
お返事ありがとうございます。
最初に試みたのは、以下の通りです。 SELECT TBL_A.ID, TBL_B.SUB_ID, Max(TBL_C.NUM) AS NUM, TBL_A.A, TBL_B.B, TBL_C.C FROM (TBL_A INNER JOIN TBL_B ON TBL_A.ID = TBL_B.ID) INNER JOIN TBL_C ON (TBL_B.SUB_ID = TBL_C.SUB_ID) AND (TBL_A.ID = TBL_C.ID) GROUP BY TBL_A.ID, TBL_B.SUB_ID, TBL_A.A, TBL_B.B, TBL_C.C; すると、【結果】は、以下の通りとなってしまいました。 ID SUB_ID NUM A B C ------- ------- ------- ------- ------- ------- 1 1 1 a aaa aaaa 1 1 2 a aaa bbbb 1 2 1 a bbb cccc 1 2 4 a bbb dddd 2 1 4 b ccc eeee 2 1 2 b ccc ffff 2 2 3 b ddd gggg 2 2 2 b ddd hhhh 3 1 2 c eee iiii 3 1 4 c eee jjjj 4 1 1 d fff kkkk 4 1 3 d fff llll ID、SUB_IDの中で同一のものの中で最大のNUMを求め、その行のCを もってきたいのですが・・・。 まずは、TomScissorsさんに教えていただいた方法で試してみます。 | ||||
|
投稿日時: 2005-03-14 10:48
お返事ありがとうございます。
最初に試みたのは、以下の通りです。 SELECT TBL_A.ID, TBL_B.SUB_ID, Max(TBL_C.NUM) AS NUM, TBL_A.A, TBL_B.B, TBL_C.C FROM (TBL_A INNER JOIN TBL_B ON TBL_A.ID = TBL_B.ID) INNER JOIN TBL_C ON (TBL_B.SUB_ID = TBL_C.SUB_ID) AND (TBL_A.ID = TBL_C.ID) GROUP BY TBL_A.ID, TBL_B.SUB_ID, TBL_A.A, TBL_B.B, TBL_C.C; すると、【結果】は、以下の通りとなってしまいました。 ID SUB_ID NUM A B C ------- ------- ------- ------- ------- ------- 1 1 1 a aaa aaaa 1 1 2 a aaa bbbb 1 2 1 a bbb cccc 1 2 4 a bbb dddd 2 1 4 b ccc eeee 2 1 2 b ccc ffff 2 2 3 b ddd gggg 2 2 2 b ddd hhhh 3 1 2 c eee iiii 3 1 4 c eee jjjj 4 1 1 d fff kkkk 4 1 3 d fff llll ID、SUB_IDの中で同一のものの中で最大のNUMを求め、その行のCを もってきたいのですが・・・。 まずは、TomScissorsさんに教えていただいた方法で試してみます。 | ||||
|
投稿日時: 2005-03-14 12:31
なかなかうまくいきません・・・。
まず、TBL_Cの中から、ID、SUB_IDが同一で、NUMがMAXのTBL_C.CのSELECTができません。 ご存知の方、ご教示ください。 [ メッセージ編集済み 編集者: ななな 編集日時 2005-03-14 12:50 ] | ||||
|
投稿日時: 2005-03-14 14:06
今日は。
by ORACLE(DB2でも同じ関数はあると思いますので、そのままいけるかと。) SELECT TBL_C.C FROM TBL_C WHERE NUM=(SELECT MAX(NUM) AS MAX_DATA FROM TBL_C WHERE ID=SUB_ID) AND ID=SUB_ID MAX_DATAの部分は適当な名前を使って下さいな | ||||
|
投稿日時: 2005-03-14 14:26
NAOさん、お返事ありがとうございます。
「TBL_Cの中から、ID、SUB_IDが同一で、」という部分ですが、TBL_Cの中でカラムID、SUB_IDが同一の行という意味でした。 説明が足りず申し訳ございません。 何とか、以下の方法で意図した結果になりましたが、 SELECT TBL_A.ID, TBL_B.SUB_ID, TBL_C_3.NUM, TBL_A.A, TBL_B.B, TBL_C_3.C FROM (TBL_A INNER JOIN TBL_B ON TBL_A.ID = TBL_B.ID) INNER JOIN (SELECT TBL_C.ID, TBL_C.SUB_ID, TBL_C.NUM, TBL_C.C FROM TBL_C INNER JOIN (SELECT TBL_C.ID, TBL_C.SUB_ID, MAX(TBL_C.NUM) AS NUM FROM TBL_C GROUP BY TBL_C.ID, TBL_C.SUB_ID) AS TBL_C_2 ON (TBL_C.NUM = TBL_C_2.NUM) AND (TBL_C.SUB_ID = TBL_C_2.SUB_ID) AND (TBL_C.ID = TBL_C_2.ID)) AS TBL_C_3 ON (TBL_A.ID = TBL_C_3.ID) AND (TBL_B.SUB_ID = TBL_C_3.SUB_ID); 冗長な感は否めません。もっと簡単な方法はないものでしょうか。 | ||||
|
投稿日時: 2005-03-14 21:19
NAOさんとほぼ一緒ですが、こんな感じでしょうか?
SELECT * FROM TBL_A,TBL_B,TBL_C WHERE TBL_C.ID=TBL_A.ID AND TBL_C.SUB_ID=TBL_B.SUB_ID AND TBL_C.NUM=(SELECT MAX(NUM) FROM TBL_C WHERE ID=TBL_A.ID AND SUB_ID=TBL_B.SUB_ID) | ||||
1
