質問: mysqlで関連したデータを横に並べたい こういうテーブル「tb」があるとします。 「tb」 bang nama tuki a103 佐藤 4 a102 高橋 5 a104 鈴木 4 a101 中川 4 a103 渡辺 5 a101 西沢 5 a102 中村 6 a104 田中 5 a103 村井 6 a107 吉田 6 a101 小林 4 これを、実行後に、 bang 4月 5月 6月 a101 中川 西沢 null a102 null 高橋 中村 a103 佐藤 渡辺 村井 a104 鈴木 田中 null a107 null null 吉田 このように、共通するbangで並べ替えたいのです。 a101の4月は、「中川」と「小林」で重複していますが、 このときはひとりだけが選択されてほしいです。 select concat(case when tuki='4' then name else ifnull(null,'') end) as '4月', ~ group by bang ~ としても、 bang 4月 5月 6月 a101 中川 となってしまい、5月と6月が上手く表示されません。 よろしくお願いします。
回答: あ、よくよく考えたらこの程度ならピボットしなくてもかけますね ピボットの場合もう少し複雑な集計をとるとき便利です。 もちろん今回のケースでも活用できます //例 select bang ,max(if(tuki=4,name,null)) as 4月 ,max(if(tuki=5,name,null)) as 5月 ,max(if(tuki=6,name,null)) as 6月 from tb as t group by bang order by bang; //ちなみに2名以上いるときの列記 select bang ,group_concat(if(tuki=4,name,null)) as 4月 ,group_concat(if(tuki=5,name,null)) as 5月 ,group_concat(if(tuki=6,name,null)) as 6月 from tb as t group by bang order by bang; //各bangに月ごと何人いるかカウントする select bang ,sum(tuki=4) as 4月 ,sum(tuki=5) as 5月 ,sum(tuki=6) as 6月 from tb as t group by bang order by bang;