コマンド道場

$ 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
zentaishoku_arizaiseki_heikin
182547753.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_idheikinninzu
19800001
25537634
45390003
55390002
35327504
74515002
NULL4160002

7

説明

AVG は平均を返します。要点は NULL を無視することです。足す側から除かれるだけでなく、割る数からも除かれます

つまり 10 行あって 3 行が NULL なら、AVG は「7 行の合計 ÷ 7」です。「10 で割ってほしい」なら SUM(式) / COUNT(*) と書くか、AVG(COALESCE(式, 0)) のように NULL を 0 に置き換えてから渡します。

型も見落としやすい点です。integer の平均は numeric になるので、小数が切り捨てられることはありません。表示桁をそろえたいときは ROUND と組み合わせます。

次に読む

関係する関数

根拠にした一次情報