目次
エンジニアにとってみれば、SQL は使えてあたりまえかもしれませんが、営業や管理部の人からすれば魅惑の魔法といわれることもあります。 しかし非エンジニアの方でも SQL が使えた方がいいですし、 そのほうがエンジニアの作業も楽になります。
ここでは、 SQL による検索結果をひとつのテーブルとして扱う方法を説明します。 サブクエリと呼ばれるものです。
環境
- PostgreSQL 9.2
他の データベースシステム でも同じです。
最大の平均を考える
営業所ごとの毎日の売上高があるとします。 それぞれの営業所について最大の1日の売上高を計算して、その平均を計算します。
id | store_id | amount | date |
---|---|---|---|
1 | 1 | 1200 | 2015-06-14 |
2 | 1 | 4000 | 2015-06-12 |
3 | 1 | 400 | 2015-06-23 |
4 | 2 | 1500 | 2015-01-17 |
5 | 2 | 1200 | 2015-01-08 |
6 | 2 | 1900 | 2015-03-21 |
7 | 3 | 6000 | 2015-08-31 |
8 | 3 | 100 | 2015-02-22 |
9 | 3 | 1000 | 2015-05-11 |
ここから、それぞれの営業所の最大売上高を出すには次のように記述します。
1 2 3 4 5 |
SELECT store_id, MAX(amount) FROM sales GROUP BY store_id |
この最大売上高の平均を取るには、上のSQLを括弧で囲み、テーブルとして扱います。
1 2 3 4 5 6 |
SELECT AVG(s.max_amount) FROM (SELECT store_id, MAX(amount) max_amount FROM sales GROUP BY store_id) s |
s
は、 サブクエリの結果をテーブルとして扱う場合のテーブル名(別名)です。
平均より大きいデータを抽出する
上のテーブルで、平均より大きいデータを抽出してみましょう。 先に平均を求めてから検索することもできますが、 サブクエリを使うと一度にできます。
1 2 3 4 5 6 7 |
SELECT id, store_id, amount, date FROM sales WHERE amount > (SELECT AVG(amount) FROM sales) |
このように、 サブクエリを WHERE
のところの条件記述に使うこともできます。