グループの平均値を求める
AVG ( [ DISTINCT | ALL ] expr )
return [ NUMBER ]
- SQL でのみ使用可能。(PL/SQL の埋め込み SQL 含む)
AVG 集計関数の内容
グループにおける 数値式 expr の平均値を戻す。
AVG 関数の追加説明と注意事項
AVG 関数の引数に DISTINCT を指定して平均を求めると重複した数値を1レコードとして処理される。
デフォルトは AVG ( ALL expr ) で動作し、 すべての数値(NULL は含まず)の平均を求める。
一般的にはグループ単位の平均を求める。⇒ GROUP BY 句 を使用していない場合には選択による結果セット(条件によって選択されたレコード) を1つのグループとして全体の平均を1レコード戻す。
注意
AVG 関数やその他の集計関数において NULL 値 は 「未定義」をあらわす。「未定義」のデータは平均値を計算するときに分子にも分母にも加算されない。これは NULL のレコードが何レコードあっても計算結果に一切影響を与えないということ。
NULL のレコードを 1 件として扱うには NULL 値を 0 などの数値として明示的に変換する必要がある
変換例 ⇒ AVG ( NVL ( expr, 0 ) ) ⇒ NVL 関数
該当データが無い場合、NULL しかデータが存在しない場合には AVG 関数は NULL を戻す。
AVG 使用例
AVG 関数 サンプルデータ
name | dept | salary |
鈴木 | 管理部 | 300,000 | 700,000 |
高橋 | 管理部 | 400,000 |
佐藤 | 開発部 | 500,000 | 1,200,000 |
小林 | 開発部 | 500,000 |
山本 | 開発部 | 200,000 |
青木 | 開発部 | NULL |
AVG と NVL を伴った AVG の違い
SQL> select dept, AVG(salary), AVG(nvl(salary, 0)),
2 count(salary) cnt, count(nvl(salary, 0)) nvl_cnt
3 from avg_sample
4 group by dept;
DEPT AVG(SALARY) AVG(NVL(SALARY,0)) CNT NVL_CNT
------------ ----------- ------------------ ---------- ----------
管理部 350000 350000 2 2
開発部 400000 300000 3 4
DISTINCT と ALL の違い
SQL> select dept, AVG(salary), AVG(distinct salary) from avg_sample
2 group by dept;
DEPT AVG(SALARY) AVG(DISTINCTSALARY)
------------ ----------- -------------------
管理部 350000 350000
開発部 400000 350000
GROUP BY なしでの平均値
SQL> select AVG(salary), count(salary) from avg_sample;
AVG(SALARY) COUNT(SALARY)
----------- -------------
380000 5
SQL 関数 - AVG 関連