エンジニアにとってみれば、SQL は使えてあたりまえかもしれませんが、営業や管理部の人からすれば魅惑の魔法といわれることもあります。 しかし非エンジニアの方でも SQL が使えた方がいいですし、 そのほうがエンジニアの作業も楽になります。
ここでは、複数のテーブルからデータを取得する場合を考えます。
環境
- PostgreSQL
- pgAdmin 3
- Windows 10
PostgreSQL を使います。 データベースに Oracle Database, MySQL を使用している場合でも同じです。
件数・合計・最大・平均を求める
次のような売上テーブル(sales)を考えます。
id | place_id | amount | member_id | sale_date |
---|---|---|---|---|
1 | 1 | 1000 | 4 | 2016-02-03 |
2 | 2 | 2000 | 4 | 2016-04-01 |
3 | 1 | 5000 | 2 | 2016-04-05 |
4 | 2 | 3000 | 3 | 2016-06-03 |
このテーブルに含まれる、売上額(amount)の件数、合計、最大、最小、平均を求めます。
1 2 3 4 5 6 |
SELECT COUNT(1), -- 件数 SUM(s.amount), -- 合計 MAX(s.amount), -- 最大 MIN(s.amount), -- 最小 AVG(s.amount) -- 平均 FROM sales s |
件数は COUNT
, 合計は SUM
, 最大は MAX
, 最小は MIN
, 平均は AVG
で計算できます。
COUNT
には 1 を指定しています。 この場合はレコード件数を返します。 COUNT(2)
や COUNT(*)
でも同じです。 また今回は影響はありませんが COUNT(s.amount)
とすると、 s.amount
に値が入っているものの合計を計算します。 データベースのデータには値のない場合があります。
また、 -- 合計
などと書いていますが、 これはコメントといいます。 --
の後に書いたものは無視されますので、 説明が必要な場合は --
の後に書いておくと後で見たときに役に立ちます。
では member_id
ごとに合計、最大、最小、平均を計算してみます。
1 2 3 4 5 6 7 8 9 |
SELECT s.member_id, COUNT(1), -- 件数 SUM(s.amount), -- 合計 MAX(s.amount), -- 最大 MIN(s.amount), -- 最小 AVG(s.amount) -- 平均 FROM sales s GROUP BY s.member_id |
member_id | count | sum | max | min | avg |
---|---|---|---|---|---|
2 | 1 | 5000 | 5000 | 5000 | 3000 |
3 | 1 | 3000 | 3000 | 3000 | 3000 |
4 | 2 | 3000 | 2000 | 1000 | 1500 |
GROUP BY
の後に、 集計のキーとなるカラム名を書くことで、 そのカラムの値をキーにして集計してくれます。 これをグループ化といいます。 ここでは member_id
でグループ化をしていますが、 複数のカラムを使って集計することもできます。
1 2 3 4 5 6 7 8 9 10 11 |
SELECT s.place_id, s.member_id, COUNT(1), -- 件数 SUM(s.amount), -- 合計 MAX(s.amount), -- 最大 MIN(s.amount), -- 最小 AVG(s.amount) -- 平均 FROM sales s GROUP BY s.place_id, s.member_id |