2009年10月20日

SQL 場合分け(case when then else end)

1プレイヤーの1局の結果を以下のように定義しました。

#kyoku_result
# 1=不聴、-2=被自摸、-3=放銃
# 0=他家和了&他家放銃
# 1=聴牌、2=自摸和、3=栄和

このデータから和了率と放銃率などを一発で抽出するSQLは知らなかったんですが
まぁ何とかなるだろうと思って…

それで、調べたらこんな構文で何とかできました。
case when then else end
初めて知りましたが、この構文すごく便利ですね。
複数の情報を一つのカラムに押し込んであるので
単純にやろうとすると複数回SQLを発行するところが、1発で取り出せます。
私の中ではデータをSELECT句でカラムへ横展開してるイメージです。
なんだか楽しくなって、case文を使いまくってこんな集計をしてみました。(MySQL)

#立直時の待ち形と和了率など
SELECT
case when m.machi_type=1 then '1種3牌'
when m.machi_type=2 then '1種4牌'
when m.machi_type=3 then '1種2牌×2'
when m.machi_type=4 then '2種8牌'
when m.machi_type=5 then '2種7牌'
when m.machi_type=11 then '1種その他'
when m.machi_type=12 then '2種その他'
when m.machi_type=13 then '3種'
when m.machi_type=14 then '4種以上'
else 'その他' end as `待ち`,
count(*) as `立直回数`,
sum(case when k.result_type in(2, 3) then 1 else 0 end)/count(*) as `和了率`,
sum(case k.result_type when 2 then 1 else 0 end)/count(*) as `自摸率`,
sum(case k.result_type when -3 then 1 else 0 end)/count(*) as `放銃率`,
sum(case k.result_type when -2 then 1 else 0 end)/count(*) as `被自摸率`,
100*sum(k.result_point)/count(*) as '平均収支'

FROM tenhou.view_machi_turn_rate_ton4disc0 m ,tenhou.tenhou_kyoku_result k
WHERE k.game_id=m.game_id and k.player_tw=m.player_tw and k.kyoku_no=m.kyoku_no
GROUP BY m.machi_type
ORDER BY m.machi_type;

結果は次の日記...
#一発で各待ち形の割合を出す方法方がわからない…
#ちなみにavg()の存在に後で気がつきました。

posted by idaten! at 18:00| Comment(1) | TrackBack(0) | プログラミング
この記事へのコメント
SQL 場合分け(case when then else end): 麻雀プログ
Posted by Super Slim at 2013年06月18日 23:41
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/33020935
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック