$ man avg
AVG
集約関数平均を求める。NULL の行は分母にも入らない。
呼び出しの形
AVG(式) AVG(DISTINCT 式)
つまずきやすいところ
NULL の行は 分母からも外れます。「n 件の平均」のつもりが「n から NULL を引いた件数の平均」になっていないか確かめてください。
対象が 0 行のときは
SUMと同じく NULL です。AVGの結果は割り切れないことが多く、そのまま表示すると桁が長くなります。ROUNDで丸めるときは表示のためだけに丸める(元の計算には丸めた値を使わない)ようにしてください。
実行例
結果は実際に流したものです。同じ SQL を 自由に打てる画面 で試すと、同じ結果になります。
SELECT ROUND(AVG(salary)) AS heikin FROM shain
| heikin |
|---|
| 542003 |
1 行
SELECT COUNT(*) AS zen, COUNT(taishoku_on) AS taishoku_ari, AVG(salary) FILTER (WHERE taishoku_on IS NULL) AS zaiseki_heikin FROM shain
| zen | taishoku_ari | zaiseki_heikin |
|---|---|---|
| 18 | 2 | 547753.125000000000 |
1 行
FILTER で対象を絞れます。退職者を含めるかどうかで平均は変わります。
SELECT busho_id, ROUND(AVG(salary)) AS heikin, COUNT(*) AS ninzu FROM shain GROUP BY busho_id ORDER BY heikin DESC
| busho_id | heikin | ninzu |
|---|---|---|
| 1 | 980000 | 1 |
| 2 | 553763 | 4 |
| 4 | 539000 | 3 |
| 5 | 539000 | 2 |
| 3 | 532750 | 4 |
| 7 | 451500 | 2 |
| NULL | 416000 | 2 |
7 行
説明
AVG は平均を返します。要点は NULL を無視することです。足す側から除かれるだけでなく、割る数からも除かれます。
つまり 10 行あって 3 行が NULL なら、AVG は「7 行の合計 ÷ 7」です。「10 で割ってほしい」なら SUM(式) / COUNT(*) と書くか、AVG(COALESCE(式, 0)) のように NULL を 0 に置き換えてから渡します。
型も見落としやすい点です。integer の平均は numeric になるので、小数が切り捨てられることはありません。表示桁をそろえたいときは ROUND と組み合わせます。
次に読む
根拠にした一次情報
- PostgreSQL 18 マニュアル: 集約関数(2026-09-02 確認)