概要
SQLで何か集計作業をする場合、CASE文の使用すると効率よく集計できるかもというお話です。
ここでは例として、選手の過去の成績で1位から3位になった回数をそれぞれ集計する例をあげます。
テストデータ
試合テーブル(game) |
---|
id |
game_name |
試合結果テーブル(result) |
---|
id |
game_id |
player_id |
rank |
選手テーブル(player) |
---|
id |
player_name |
非効率な方法
パッと思いつく方法としては、where句でrankを条件分岐して、1つ1つ集計する方法が考えられるかと思います。
SELECT
player_id,
COUNT(*) AS first_place_count
FROM
result
WHERE
- 2着、3着の場合は下記の条件分岐を変更
rank = 1
GROUP BY
player_id
;
しかし、上記の方法の場合、SQLを3回実行しなくてはいけなくなり、I/O面で効率的ではありません。
上記のようなことを解決するために、登場するのがCASE文です。
CASE文を利用した集計SQL
CASE文を使用すると、1回でそれぞれの回数を算出することができます!
SELECT
player_id,
- 1着回数
SUM(
CASE
WHEN rank = 1 THEN 1
ELSE 0
END
) AS first_place_count,
- 2着回数
SUM(
CASE
WHEN rank = 2 THEN 1
ELSE 0
END
) AS second_place_count,
- 3着回数
SUM(
CASE
WHEN rank = 3 THEN 1
ELSE 0
END
) AS third_place_count
FROM
result
GROUP BY
player_id
;
上記の方法であれば、一度のSQLで1着から3着までの回数を算出することができるため、効率的な集計をすることができ、処理も複雑になることがありません。
まとめ
もし、何かデータを集計する処理が出てきた場合には、where句で条件分岐することを考える前に、CASE文でうまく集計できないか考えてみるのも良いかと思います。
私自身、where句ばかりで条件分岐をさせることばかり考えていたので、CASE文という方法を知り、かなり効率的に集計処理をすることができるようになりました。
ぜひ、よかったらみなさんもCASE文の使用を考えてみてください!