0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

株式会社シンプルウェイAdvent Calendar 2024

Day 12

SQLで集計作業をする際、CASE文の使用のすすめ

Posted at

概要

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文の使用を考えてみてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?