【SQL道場コース】総合演習問題 複雑なユーザーデータの分析【Progate】
複雑なユーザーデータの分析
問1
SELECT 〇〇
設問の通り、3つのデータを取得する
- ユーザーIDを取得する
- ユーザー名を取得する
- カウント関数を使い、"購入数"名に変換する
users.id, users.name, count(*) AS "購入数"
COUNT関数を使う。これは指定したカラムの合計数を計算してくれる
ただし、「NULLも含めたカウント関数」を使うこと。
分からなければ下記参照
FROM 〇〇
取得データ内訳
- 設問の対象ユーザーデータを取得するために、どの「テーブル」を選ぶべきか考える
JOIN 〇〇
-
「購入したユーザーの記録」をつなげる必要がある、と考える。するとどのカラムを結合するかが分かるようになる
複数テーブルを1つに結合するための作業
ON 〇〇
下記をそれぞれ結合条件とする
- 販売データ
- ユーザーデータ
ONとは、JOIN(結合)にたいする「条件」(ON)を指す
ON データ同士を "=" によってつなげること
テーブルA.カラム名 = テーブルB.カラム名
Aに対するカラム名は外部キーを、テーブルBにたいするカラム名は主キーを指定する
GROUP BY 〇〇
それぞれのカラム内IDをグループ化すること。ヒントは見本にもある通り、usersのID,nameである。
- 見本のIDから考察
- 見本のnameから考察
GROUP BY カラム名
カラム名.ID, カラム名.name ←どこにも =をつかっていない。
HAVING
「条件を満たすグループを取得」したい時、HAVINGを使う。条件は下記の通り。
- 10個以上購入したユーザー
HAVING 条件 この様に書く
何日~”以上”購入とあるので、>= という関係演算子を使用する
分からなければ下記参照
問1まとめ
- SELECT 何を知りたいの?(問題文)
- FROM その知りたいソースはどのテーブルから持ってくるの?
- JOIN 'FROM'とどのテーブルをつなげたいの?
- ON じゃあJOINに書いたテーブル同士をつなげるための共通IDをちょうだい。
- GROUP BY データをグループ化する作業にはいるから、グループ化したいカラム名をそれぞれちょうだい。(問題文から考察)
- HAVING データ取得には何か条件あったよね?その条件をここに書いてね
- ;(セミコロン)を書いて終了でーす。
ここからヒント形式のような文言を書きました。考えながらスムーズに答えを導くトレーニングをするためです。分からなければ答えを見る。そしえ、「どうして?」「なぜ?こうなったのか」を追求するだけです。
問2
問2の解答要約:購入・売上記録からユーザーID,特定商品の販売記録を取得する。それにはJOINをつかって異なるカラム同士をつなげ、データ取得する。
SELECT
- 何を知りたいの?(問題文)
FROM
- その知りたいソースはどのカラムデータから持ってくるの?
JOIN
- 'FROM'とどのテーブルをつなげたいの?
ON
- ON じゃあJOINに書いたテーブル同士をつなげるための共通IDをちょうだい。ID書いてなかったらIDを取得すること!(FROM テーブルID と SELECT テーブルID)
WHERE
- どの「横の行」(レコード)のデータが欲しいの?それから、そのレコードデータを求めるにはもう一回クエリを書かなければいけない。そうだ、サブクエリ"()" を使ってデータを1つにまとめちゃおう。
SELECT
- 何を知りたいの?(問題文)そもそもWHEREでは何を知りたかったのかを表示すれば良いだけだよ。
FROM
- その知りたいソースはどのカラムデータから持ってくるの?
WHERE
- どの「横の行」(レコード)のデータが欲しいの?そしてそのレコード名は何ていうの?(サブクエリここまで)
GROUP BY
- データをグループ化する作業にはいるから、グループ化したいカラム名をちょうだい。(問題文から考察)
セミコロン
- そして終わったら;(セミコロン)を忘れないようにね!