PostgreSQL集約関数:SQLで計算や最大・最小値を算出する方法

  • Category: SQL
  • Tags: PostgreSQL

  • Posted on: 2021-11-23

  • Updated on: 2022-01-22

本記事では以下の集約関数を見ていきます.
<使用イメージ>

  • 足し算:SUM()
  • データの個数確認:COUNT()
  • 平均:AVG()
  • 最大値:MAX()
  • 最小値:MIN()

上記の関数は結果をひとつのデータとして返してきます.
例示を見ながら確認していきましょう.

PostgreSQLのバージョン

psql (PostgreSQL) 14.5

事前準備

まずはサンプルのテーブルを作成します.


CREATE TABLE buncho (
    id serial PRIMARY KEY, -- 番号
    name VARCHAR (30) NOT NULL, -- お名前
    age INTEGER NOT NULL, -- 年齢(歳)
    weight DECIMAL(5, 2) NOT NULL, -- 体重(g)
    birdseed DECIMAL(5, 2) NOT NULL -- 1日の餌の量(g)
);

INSERT INTO buncho (name, age, weight, birdseed)
VALUES
    ('ぶんぶん', 2, 21.3, 4),
    ('ピースケ', 1, 22.6, 4),
    ('シロ', 3, 23.7, 4),
    ('うずら', 1, 25.9, 6),
    ('らむね', 5, 24.0, 5),
    ('シルバー', 2, 23.5, 5)
;

SELECT * FROM buncho;
id name age weight birdseed
1 ぶんぶん 2 21.30 4.00
2 ピースケ 1 22.60 4.00
3 シロ 3 23.70 4.00
4 うずら 1 25.90 6.00
5 らむね 5 24.00 5.00
6 シルバー 2 23.50 5.00

足し算 SUM()

birdseed 列をすべて足します.
結果を見ると,足し算された結果が1つの値として返ってきていますね.


SELECT
    SUM(birdseed)
FROM
    buncho;
sum
28.00

データの個数確認 COUNT()

データの個数をカウントします.
6つのデータ(行)がカウントされて返ってきました.


SELECT
    COUNT(*) AS buncho_count
FROM
    buncho;
buncho_count
6

注意

COUNT(*)とすると要素がNULLであってもカウントして返してくれます.
特定の列を指定する場合はNULLをカウントせずに返してくれます.

平均 AVG()

データの平均値を算出します.1


SELECT
    ROUND(AVG(weight), 2) AS weight
FROM
    buncho;
weight
23.50

最大値・最小値 MAX() MIN()

データの最大値・最小値を表示してくれます.


SELECT
    MAX(weight)
FROM
    buncho;
max
25.90

SELECT
    MIN(weight)
FROM
    buncho;
min
21.30

条件をつけて集約関数を使用する

ここではWHERE句やGROUP BY句,HAVING句で条件を絞って集計する例を見てみます.

特定の条件のデータだけを足し算

age(年齢)が1歳の文鳥だけに絞って集計してみます.
年齢が1歳の2羽におけるbirdseedを足した結果が返ってきていますね.


SELECT
    SUM(birdseed)
FROM
    buncho
WHERE
    age = 1;
sum
10.00
グループでまとめて足し算

GROUP BY句でage(年齢)ごとにまとめて足し算してみましょう.


SELECT age,
    SUM(birdseed)
FROM
    buncho
GROUP BY
    age
ORDER BY
    age;
age sum
1 10.00
2 9.00
3 4.00
5 5.00

今回はデータが少ないのであまりまとまっていませんが,それぞれの年齢ごとにbirdseedが集計されていることがわかりますね.

参考

クエリの最後にあるORDER BY句はage列を基準に並び替えるために入れています.

一旦集計した結果をさらに絞る

上記のグループごとにまとめて足し算した結果のうち,birdseedが7以上のデータを抽出します.
このような場合にはHAVING句に集約関数を記載します.


SELECT age,
    SUM(birdseed) AS birdseed
FROM
    buncho
GROUP BY
    age
HAVING
    SUM(birdseed) >= 7
ORDER BY
    age;
age birdseed
1 10.00
2 9.00

集約した結果に対し,さらに絞り込んだ結果を得ることができました!

ひとこと

SQLの集約関数について基本的な使い方を勉強しました.


  1. ROUND(AVG(weight), 2)としているのは,出力結果を小数点第二位までとするためです.