Home > pgsql > ミックさんのパズルに挑戦

ミックさんのパズルに挑戦

ミックさんの問題に挑戦してみました。 case文を使う方が先に思いついたけど。こんな感じかな。 ヒラをどこで弾くかが微妙なところですが。

方法はいくつかありますが、代表的なものとしては、HAVINGを使ってUNIONする非効率的なものと、CASE式を使った効率的なものがあります。それぞれどんなクエリになるか、考えてみてください。

Yahoo!ジオシティーズ - ミックのブログ

create table roles (
  person text,
  role   text
);

copy roles from stdin;
スミス   部長
スミス   役員
ジョーンズ 部長
ホワイト    役員
ブラウン    ヒラ
\.

select person
     , '兼務'
  from roles
 group by person
 having count(*) > 1
union
select person
     , min(role)
  from roles
 where role <> 'ヒラ'
 group by person
 having count(*) = 1;

select person
     , case when count(*) > 1 then '兼務'
       else min(role)
       end
  from roles
 where role <> 'ヒラ'
 group by person;

min()はmax()でも一緒です。

Writeback:1

正解 from ミック 2007/05/12 (Sat) 23:35:36
はい、正解です。
CASE式を使うことで、HAVINGを二つ使って記述していた分岐条件をSELECT句で設定できるので、集約が一回ですむし、UNIONも要らない、というのがポイントですね。
Comment Form

writeback message: Ready to post a comment.

TrackBack ping me at
http://www.mono-space.net/blog/pgsql/e070512_case.trackback

Page Top