dポイントプレゼントキャンペーン実施中!

こういうテーブル「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月が上手く表示されません。

よろしくお願いします。

A 回答 (2件)

あ、よくよく考えたらこの程度ならピボットしなくてもかけますね


ピボットの場合もう少し複雑な集計をとるとき便利です。
もちろん今回のケースでも活用できます

//例
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;
    • good
    • 0
この回答へのお礼

おお!うまく表示されました!文字列にMAXって使えたんですね……。
2名以上や人数のカウントも勉強になりました!
ピボットテーブルもしっかり頭に入れておきます!

ありがとうございました!
助かりました!

お礼日時:2013/02/07 01:24

この手の処理にはピボットテーブルを使うと処理が楽です



//元データ
create table tb (bang varchar(10),name varchar(10),tuki int);
insert into tb values('A103','佐藤',4),('A102','高橋',5),('A104','鈴木',4),('A101','中川',4),('A103','渡辺',5),('A101','西沢',5),('A102','中村',6),('A104','田中',5),('A103','村井',6),('A107','吉田',6),('A101','小林',4);

//ピボットテーブル
create table pivot(month int,m4 int null,m5 int null,m6 int null);
insert into pivot(month,m4) values(4,1);
insert into pivot(month,m5) values(5,1);
insert into pivot(month,m6) values(6,1);

//結果
select bang
,max(if(m4,name,null)) as 4月
,max(if(m5,name,null)) as 5月
,max(if(m6,name,null)) as 6月
from tb as t
inner join pivot as p on t.tuki=p.month
group by bang
order by bang;
    • good
    • 0

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

関連するカテゴリからQ&Aを探す