SQLでデータ抽出を行う際に、一つのSQLの実行結果をもとに、また別のSQLで抽出を行いたい時がありませんか?
例えば、1年分の日別の売上データから、月ごとの売上の平均を求めたい場合を考えてみましょう。
このとき、まず日別の売上を月ごとに合計し、その上で月ごとの売上の平均を計算する必要があります。
このような2段階の集計が必要となる場合、一見すると2つのクエリが必要に感じます。
ではこれを1つのクエリで表現したい場合、どのようにすれば良いと思いますか?
今回解説するサブクエリを使えば、このような2段階以上の集計を1つのクエリで簡単に表現できます。
サブクエリが使えるようになると、SQLの表現の幅が広がりますので、ぜひマスターしてくださいね。
なおキノコードでは、この動画の他にもたくさんのプログラミングの動画を配信しています。
チャンネル登録がまだの方は、チャンネルがどこに行ったか分からなくならないように、是非チャンネル登録をお願いします。
それではレッスンスタートです。
▼書き起こしブログ
https://kino-code.com/sql_21/
▼関連動画
【SQL超入門講座】01.コース紹介 ~ SQLとは? ~ 環境構築|初心者向け
【SQL超入門講座】02.データベースのテーブルとは?
【SQL超入門講座】03.SELECT文|SQLの基本中の基本
【SQL超入門講座】04.WHERE|特定の条件でデータを抽出する方法
【SQL超入門講座】05.ORDER BY|データの並び替え
【SQL超入門講座】06.GROUP BY|グルーピング、グループ化
【SQL超入門講座】07.HAVING|グループ化したデータの中からデータ抽出
【SQL超入門講座】08.JOIN|テーブルの結合(INNER JOIN/LEFT JOIN)
【SQL超入門講座】09.PostgreSQLの環境構築|MacとWindowsで解説!
【SQL超入門講座】10.PythonとPostgreSQLの接続
【SQL超入門講座】11.データベースのバックアップと復元
【SQL超入門講座】12.テーブルの結合(RIGHT JOIN/OUTER JOIN)
【SQL超入門講座】13.AND, OR|複数条件で抽出する方法
【SQL超入門講座】14.LIKE|部分一致や前方一致、後方一致するレコードを抽出する方法
【SQL超入門講座】15.BETWEEN|区間を指定して抽出する方法
【SQL超入門講座】16.LENGTH関数|文字数を条件にしてデータを抽出する方法
【SQL超入門講座】17.DISTINCT|重複した値を排除して抽出する方法
【SQL超入門講座】18.SUBSTRING|文字列の一部を切り出す方法
【SQL超入門講座】19.正規表現|複雑なパターンマッチングを条件に抽出する方法
【SQL超入門講座】20.ROUND|四捨五入を思いのままにできますか?
【SQL超入門講座】21.CASE|条件に合わせて処理を分ける方法
▼自己紹介
ブログに自己紹介を書いております。
▼SNS
Twitter : https://twitter.com/kino_code/likes
Facebook : https://www.facebook.com/キノコード -105693727500005/
Website : https://kino-code.com/
▼書き起こし
サブクエリは、ひとつのSQLをカッコで括ったもので、一つのテーブルとして扱えるようになります。
そして別のSQL文の内部に埋め込んで使用することができます。
例えば抽出や計算をしたAというSQLがあるとします。
Aを更に計算したり、別のテーブルとくっつけたりしたいことがありますよね。
このような時、Aをカッコで括りサブクエリとして、別のSQLに埋め込んで使用します。
サブクエリには様々な使い方がありますが、ちょっといくつか例文を見てみましょう。
“`SQL
SELECT カラムA
,SUM(カラムB)
FROM
(SELECT カラムA
,カラムB
FROM テーブル
WHERE 条件式)
GROUP BY カラムA
“`
このSQL内部のサブクエリは、テーブルからAというカラムとBという数値が入ったカラムを条件式によって抽出しています。
それをFROM句に用いることで、カラムAごとの数値の合計を計算しています。
次の例文も見てみましょう。
“`SQL
SELECT テーブルC.カラムA
,テーブルC.カラムB
,テーブルD.カラムE
FROM
(SELECT カラムA
,カラムB
FROM テーブルC
WHERE 条件式)
JOIN テーブルD
ON テーブルC.カラムA = テーブルD.カラムA
“`
こちらはちょっと複雑ですが、サブクエリでテーブルCからカラムAとBを抽出しています。
これをテーブルDと結合し、テーブルCのカラムAとB、テーブルDのカラムEを抽出しています。
それでは、ここからは実際にテーブルを使ってSQLを書いてみましょう。
使用するtest_tableは、このようなカラムからなる、いつ誰が何をどれだけ売り上げたか記録されているテーブルです。
[サブクエリを使ってみよう]
まずはtest_tableから、
「売上日」ごとに「商品分類がトップスの商品を売り上げたユニークな社員ID」の数を計算します。
そこから月ごとにのべ何人の人がトップスを売り上げたのか計算してみます。
SQLはこのように書きます。
“`SQL
SELECT SUBSTRING(TO_CHAR(“売上日”,’YYYY-MM-DD’),1,7) ym,
SUM(uu) nb_uu
FROM
(SELECT “売上日”,
COUNT(DISTINCT “社員ID”) uu
FROM test_table
WHERE “商品分類” = ‘トップス’
GROUP BY “売上日”) tmp
GROUP BY ym
“`
まず、サブクエリの中を見てみてみましょう。
「売上日」ごとに「商品分類がトップスの商品を売り上げたユニークな社員ID」の数がここで抽出・計算されています。
確認のため、一度サブクエリだけを切り取って実行してみましょう。
売上日ごとにユニークな社員IDの数が抽出されました。
このサブクエリをテーブルとしてFROM句に使用し、月ごとにのべ何人の人がトップスを売り上げたのかを計算します。
サブクエリの売上日のカラムからsubstr関数で年月の部分だけを抽出し、ユニークな社員IDの数をSUM関数で月ごとに集計すればOKです。
(続く)
#SQL #抽出 #サブクエリ #PostgreSQL
コメント
素晴らしい、説明と実務があってクエリの動作がイメージし易いです