参考書に記載されていたcase文の読み方はよくわかりません
次のようなテーブルを作成しデータを入れました。
sql
1DROP TABLE IF EXISTS master_customer; 2create table master_customer( 3user_id char(008), 4age int, 5sex char(008), 6user_place char(016) 7); 8insert into master_customer values 9('UID0001',45,'M','Kanagawa'), 10('UID0002',31,'M','Osaka'), 11('UID0003',22,'M','Tokyo'), 12('UID0004',25,'W','Tokyo'), 13('UID0005',36,'W','Tokyo'), 14('UID0006',40,'W','Kanagawa'), 15('UID0007',34,'M','Kanagawa'), 16('UID0008',24,'W','Tokyo'), 17('UID0009',30,'M','Tokyo'), 18('UID0010',25,'W','Osaka'), 19('UID0011',20,'W','Tokyo'), 20('UID0012',31,'W','Osaka')
そこで次のようなSQLを実行し
それぞれの地域の男女の数をsqlで集計しました。
sql
1WITH count_tmp AS( -- (1) 2 SELECT 3 sex, 4 user_place, 5 COUNT(user_id) AS user_count 6 FROM 7 master_customer 8 GROUP BY 9 user_place, 10 sex 11 ORDER BY 12 user_place DESC 13), 14tmp AS( -- (2) 15 SELECT 16 *, 17 ROW_NUMBER() OVER( 18 PARTITION BY sex 19 ORDER BY user_place 20 ) AS sequence 21 FROM 22 count_tmp 23) 24SELECT -- (3) 25 sex, 26 MAX(CASE sequence WHEN 1 THEN user_count ELSE NULL END) AS Kanagawa, 27 MAX(CASE sequence WHEN 2 THEN user_count ELSE NULL END) AS Osaka, 28 MAX(CASE sequence WHEN 3 THEN user_count ELSE NULL END) AS Tokyo 29FROM 30 tmp 31GROUP BY 32 sex 33;
集計用SQLについて
(1)と(2)のSQLは理解できました。
(1)はこれはuser_placeと性別でグループで分割した後にグループごとのデータ数を取得しています。さらに(2)ではウインドウ関数を使用して性別ごとに分割し場所ごとにorder byで並び替えること場所とsequenceという列の値がそれぞれ対応するようなデータが作成されます。
ここまでは理解できたのですが
(3)のcase文が理解できません
そもそもこのcase文は(1)、(2)によって作成されたデータがさらに性別でグループ分けされたデータを1文づつ相関サブクエリのように評価しているような記載が参考書にありました。
case文は集約関数であれば問題はないようです
case文はsequenseの値を一文づつ評価して該当しないものに関してはNULLを返し
sequenseというテーブルの中にNULLとそれ以外のデータが作りださせそれが集約関数でNULLが排除され値を返すイメージですか?
case文によって疑似的なテーブルが作成されるのでしょうか?
なんだかこのSQLの実行タイミングなどなかなかイメージが付きづらいので
どなたかどのようにcase文が結果を返しているの解説していただけますでしょうか?
以上です、よろしくお願いいたします。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/24 11:01
2021/08/24 16:58
2021/08/24 22:18
2021/08/25 00:25