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が便利です。
関連: SQLスタイルガイド