質問: 書籍「達人に学ぶSQL徹底指南書」を学習していて不明な点があるので教えてください。 リンク内容 1 ``` SELECT SUM(popularity), CASE pre_name WHEN '徳島県' THEN '四国' WHEN '香川県' THEN '四国' WHEN '愛媛県' THEN '四国' WHEN '高知県' THEN '四国' WHEN '福岡県' THEN '九州' WHEN '佐賀県' THEN '九州' WHEN '長崎県' THEN '九州' WHEN '熊本県' THEN '九州' WHEN '大分県' THEN '九州' ELSE 'その他' END FROM Table_A GROUP BY CASE pre_name WHEN '徳島県' THEN '四国' WHEN '香川県' THEN '四国' WHEN '愛媛県' THEN '四国' WHEN '高知県' THEN '四国' WHEN '福岡県' THEN '九州' WHEN '佐賀県' THEN '九州' WHEN '長崎県' THEN '九州' WHEN '熊本県' THEN '九州' WHEN '大分県' THEN '九州' ELSE 'その他' END; ``` 上記のSQLがどうして成立するかが理解できていません。 釈然としない点は 1.『GROUP BY 列名』 ではなく 『GROPU BY 定数』 の形になっているように思われる 2.GROUP BY CASE・・・以下の文で、まるでCASE文で変換を行ったビューを作った上で、そのビューに対してGROUP BYによる集計かけているように感じてしまうが、その考えの根拠も正しさもわからない。 2 ``` SELECT SUM(popularity), CASE pre_name WHEN '徳島県' THEN '四国' WHEN '香川県' THEN '四国' WHEN '愛媛県' THEN '四国' WHEN '高知県' THEN '四国' WHEN '福岡県' THEN '九州' WHEN '佐賀県' THEN '九州' WHEN '長崎県' THEN '九州' WHEN '熊本県' THEN '九州' WHEN '大分県' THEN '九州' ELSE 'その他' END AS district FROM Table_A GROUP BY district; ``` 実現しようとしていることが2のようなことであることは理解し、かつ実効順序の関係でオラクルでは2が正しく動かないこともわかるのですが、なぜ1の書き方で2が実現できるかわかりません。 どうかご教授ください。よろしくお願いいたします。
回答: 1.『GROUP BY 列名』 ではなく 『GROPU BY 定数』 の形になっているように思われる → 定数と言うか、列データを変換された値ですかね 2.GROUP BY CASE・・・以下の文で、まるでCASE文で変換を行ったビューを作った上で、そのビューに対してGROUP BYによる集計かけているように感じてしまうが、その考えの根拠も正しさもわからない → イメージ的にはそんな感じかと思います。 しかし実際にはこんなバカげたSQLは作らないと思いますが、 四国・九州等が入るフィールドを追加して、そのフィールドでGROUP BY した方が 断然早いですからね