SQL: CASE式の練習

以下の本を読んでいて、CASE文/式というものがあるのを知ったので試してみます。

対象となるテーブル

mysqlがEXAMPLE DATABASEとして提供しているWorld Database を使用します。

mysql> select * from city where CountryCode='USA' limit 5;
+------+--------------+-------------+--------------+------------+
| ID   | Name         | CountryCode | District     | Population |
+------+--------------+-------------+--------------+------------+
| 3793 | New York     | USA         | New York     |    8008278 |
| 3794 | Los Angeles  | USA         | California   |    3694820 |
| 3795 | Chicago      | USA         | Illinois     |    2896016 |
| 3796 | Houston      | USA         | Texas        |    1953631 |
| 3797 | Philadelphia | USA         | Pennsylvania |    1517550 |
+------+--------------+-------------+--------------+------------+
5 rows in set (0.01 sec)

CASE文による串刺し集計

↑のテーブルに対し、CASE式を使うことで、国ごとの串刺し集計ができます。 以下の例では、 CountryCode フィールドの値が USA のものは「アメリカ」、 IND のものは「インド」、それ以外の値をもつ地域は「その他」として Population フィールドの合計値を集計しています。

SELECT
    -- CASE式
    CASE CountryCode    
        WHEN 'USA' THEN 'アメリカ'
        WHEN 'IND' THEN 'インド'
        ELSE 'その他'
    -- ENDで終了する
    END AS country,
    SUM(Population)
FROM
    city
GROUP BY
    country
;

実行結果

mysql> SELECT CASE CountryCode WHEN 'USA' THEN 'アメリカ' WHEN 'IND' THEN 'インド' ELSE 'その他' END AS country, SUM(Population) FROM city GROUP BY country ;
+--------------+-----------------+
| country      | SUM(Population) |
+--------------+-----------------+
| その他       |      1227635584 |
| アメリカ     |        78625774 |
| インド       |       123298526 |
+--------------+-----------------+
3 rows in set (0.02 sec)

余談

SQL文を整形したい時は、 SQLフォーマッターFor WEBが便利です。

f:id:smatsuzaki:20200607131719p:plain
SQL文をいい感じに整形してくれます

関連: SQLスタイルガイド

/* https://sunrise033.com/entry/hatena-blog-how-to-hierarchicalize-categories */