複数レコードのデータを1レコードに集約したい
お世話になります。
複数レコードのデータを1レコードに集約したいのですが色々試してみましたが上手くいきません。
まず、以下のようなテーブルがあります。
TableA(キーはID)
ID NO
1, 2
TableB(キーはIDとNO)
ID NO SYU_NO FUKU_NO
1, 1, 1, 1
1, 2, 1, 2
1, 3, 2, 1
2, 1, 1, null
・
・
TableC(キーはIDとKUBUNとNO)
ID KUBUN(SYU or FUKU) NO START END KAKUNIN
1, 1, 1, 20090101, 20091231, 20090310
1, 1, 2, 20090201, 20091130, 20090310
1, 2, 1, 20090401, 20100331, 20090312
・
・
これを、以下のようなレコードにしたいのですが・・。
ID START(SYU_NO) END(FUKU_NO) START(FUKU_NO) END(FUKU_NO)
1, 20090101, 20091231, 20090401, 20100331
以下のようなselect文を作成しましたが・・。
select
A.ID || ',' ||
case when C.KUBUN = 1 then C.START end || ',' ||
case when C.KUBUN = 1 then C.END end || ',' ||
case when (C.KUBUN = 2 and B.FUKU_NO = C.NO) then C.START end || ',' ||
case when (C.KUBUN = 2 and B.FUKU_NO = C.NO) then C.END end || ',' ||
from
TableA A
inner join
TableB B
on
A.ID = B.ID
and A.NO = B.NO
inner join
TableC C
on
B.ID = C.ID
and ((C.KUBUN = 1 and B.SYU_NO = C.NO)
or (C.KUBUN = 2 and B.FUKU_NO = C.NO))
;
以下のような結果が返ってきます。
ID START(SYU_NO) END(FUKU_NO) START(FUKU_NO) END(FUKU_NO)
1, 20090101, 20091231, ,
1, , , 20090401, 20100331
実は別サイトでも投稿しておりますが回答がなく大変困っております。
どうか宜しくお願い致します。
お礼
yambejp様 こんばんは。いつもお世話になっております。 >別々で集計してUNIONで結合するのが妥当では? なるほど~こういうやり方があったんだ~・・と思いつつ、 $sql = "select c.subject,m2.n_name,c.date,c.no,f.f_id from member as m inner join friend as f on m.id=f.id and m.id=$id inner join diary as c on f.f_id=c.id inner join member as m2 on m2.id=c.id order by no desc LIMIT 0, 30;"; という自分以外のデータを表示するSQL(以前お教えいただいたSQLを参考にしています)と、UNIONで結合すべく、UNIONで結合すべき条件としてデータ型を揃えるなどとあったので、自分のみを表示するSQLを先SQLを変更したところ、当初に質問にも記載したように、自分の発言が2度出る状態となっていたため、 $sql = "select c.`id`, c.`no`, c.`subject`, c.`date`, m.`id`, m.`n_name` FROM diary as c INNER JOIN member as m ON c.`id` = m.`id` WHERE c.`id` = $tb_id order by c.`date` desc limit 0, 30;"; とし、UNIONで結合してみたのですが上手くいきません。 今回、yambejp様のアドバイスでUNION(今まで使ったことがない)を知り(恥)、一気に道が開けたような気がしたのですが、いまいち理解に苦しんでおります。 このお礼(報告)の後も、解決に向け引続き調べてはいきますが、お時間が許されるなら、引続きご指導いただければ幸いです。 お忙しい中恐縮ですが、宜しくお願いいたします。
補足
yambejp様 こんばんは。お世話になっております。 随分と時間が掛かってしまいましたが、以下のSQLで、とりあえず期待の結果を得ることが出来ました。 まだまだ不完全なSQLかとは思いますが、結果を得ることが出来たのもyambejp様のアドバイスあってのことです。有難う御座いました。 $sql = "(select m.id, c.subject,m2.n_name,c.date,c.no,NULL,f.f_id from member as m inner join friend as f on m.id=f.f_id and f.id=$tb_id inner join diary as c on f.f_id=c.id inner join member as m2 on m2.id=c.id order by no desc LIMIT 0, 30) UNION ALL (select m.`id`, c.`subject`, m.`n_name`, c.`date`, c.`no`, c.`id`, NULL FROM diary as c INNER JOIN member as m ON c.`id` = m.`id` WHERE c.`id` = $tb_id order by c.`no` desc LIMIT 0, 30) order by no desc";