【ORACLE】集計関数


ここではORACLEデータベースのSQLで、集計関数の使い方を紹介しています。

AVG関数

AVG関数では、平均値を計算したい数値または列名を指定します。

・DISTINCT/ALL
 DISTINCTを指定すると重複値を除いた平均値を求めます。ALLを指定すると全ての値の平均値を求めます。デフォルト値はALLです。

AVG([DISTINCT | ALL]式)

AVG:レコード全体から平均値を求める

レコード全体から平均値を求める場合は、GROUP BYを指定せずにAVG関数を使います。

GROUP BYを使わずにAVG関数を記述した場合、SELECT結果全体を1つのグループとして捉え、SELECT結果全体から平均値を計算します。

SELECT AVG(age) FROM employee;

AVG:グループごとの平均値を求める

次のSQLでは、EMPLOYEE表でdept_cdでグループ化し、AGE列の平均値を計算しています。

SELECT dept_cd,AVG(age) FROM employee GROUP BY dept_cd;

複数の列でグループ化した結果の平均値を求めることもできます。
次のSQLでは、DEPT_CDとJOB_IDごとのAGE列の平均値を計算しています。

SELECT dept_cd,job_id,AVG(age) FROM employee GROUP BY dept_cd,job_id;

AVG:重複値を除いた平均値を求める

重複値を除く場合は、AVG関数でDISTINCTを指定します。

SELECT AVG(DISTINCT age) FROM employee;

AVG:特定のレコードから平均値を求める

AVG関数を使うSQLでも、通常のSELECT文と同じようにWHERE句に条件を書くことが出来ます。

次のSQLでは、WHERE句でDEPT_CDが001または002のレコードを対象として、DEPT_CDグループ化し、平均値を求めています。

SELECT AVG(age) FROM employee WHERE dept_cd in ('001','002');

WHERE句の条件には、EXISTSや副問合せを使うこともできます。
次のSQLではEMPLOYEE表のレコードで、SALES表に該当するレコードが存在するレコードを対象として、AGE列の平均値を求めています。

--EXISTSの例
SELECT
    AVG(a.age)
FROM
    employee a
WHERE
    EXISTS (SELECT
                'x'
            FROM
                 sales b
            WHERE
                 a.id = b.id);

--サブクエリーの例
SELECT
    AVG(a.age)
FROM
    employee a
WHERE
    a.id (SELECT DISTINCT
              b.id
          FROM
              sales b);

AVG:(注意点)NULL値のレコードについて

AVG関数では、NULL値のレコードは平均値の計算に含まれません。

グループ内のレコードが全てNULLの場合は、NULLが返されます。

COUNT関数

COUNT関数では、行数をカウントしたい式または列名を指定します。

・DISTINCT/ALL
 DISTINCTを指定すると重複値を除いた行数を求めます。ALLを指定すると全ての行数を求めます。デフォルト値はALLです。

COUNT([DISTINCT | ALL] 式)

COUNT:テーブル全体の行数を求める

テーブル全体から行数を求める場合は、GROUP BYを指定せずにCOUNT関数を使います。

SELECT COUNT(*) FROM employee;

COUNT:グループごとの行数を求める

次のSQLでは、EMPLOYEE表でdept_cdでグループ化し、行数を計算しています。

SELECT dept_cd,COUNT(*) FROM employee GROUP BY dept_cd;

複数の列でグループ化した結果の行数を求めることもできます。
次のSQLでは、DEPT_CDとJOB_IDごとの行数を計算しています。

SELECT dept_cd,job_id,COUNT(*) FROM employee GROUP BY dept_cd,job_id;

COUNT:特定の列の行数を求める

次のSQLでは、AGE列の行数を求めています。

COUNT関数では、NULL値は無視されるので、NULL値以外の値の個数が返されます。

SELECT COUNT(age) FROM employee;

COUNT:重複値を除いた行数を求める

重複値を除く場合は、COUNT関数でDISTINCTを指定します。

SELECT COUNT(DISTINCT age) FROM employee;

COUNT:特定のレコードから行数を求める

COUNT関数を使うSQLでも、通常のSELECT文と同じようにWHERE句に条件を書くことが出来ます。

次のSQLでは、WHERE句でDEPT_CDが001または002のレコードを対象として、DEPT_CDグループ化し、行数を求めています。

SELECT COUNT(*) FROM employee WHERE dept_cd in ('001','002');

WHERE句の条件には、EXISTSや副問合せを使うこともできます。

次のSQLではEMPLOYEE表のレコードで、SALES表に該当するレコードが存在するレコードを対象として、AGE列の行数を求めています。

--EXISTSの例
SELECT
    COUNT(*)
FROM
    employee a
WHERE
    EXISTS (SELECT
                'x'
            FROM
                 sales b
            WHERE
                 a.id = b.id);

--サブクエリーの例
SELECT
    COUNT(*)
FROM
    employee a
WHERE
    a.id (SELECT DISTINCT
              b.id
          FROM
              sales b);

COUNT:(注意点)NULL値のレコードについて

COUNT関数では、NULL値のレコードは行数の計算に含まれません。

全てのレコードがNULLの場合は0を返します。

MAX関数

MAX関数では、最大値を計算したい式または列名を指定します。

MAX関数では数値、文字列、日付型を指定することが出来ます。

GROUP BYを指定しない場合は、SELECT結果全体を1つのグループとして集計します。

MAX(式) 

MAX:レコード全体から最大値を求める

レコード全体から最大値を求める場合は、GROUP BYを指定せずにMAX関数を使います。

GROUP BYを使わずにMAX関数を記述した場合、SELECT結果全体を1つのグループとして捉え、SELECT結果全体から最大値を計算します。

SELECT MAX(age) FROM employee;

MAX:グループごとの最大値を求める

次のSQLでは、EMPLOYEE表でdept_cdでグループ化し、AGE列の最大値を計算しています。

SELECT dept_cd,MAX(age) FROM employee GROUP BY dept_cd;

複数の列でグループ化した結果の最大値を求めることもできます。
次のSQLでは、DEPT_CDとJOB_IDごとのAGE列の最大値を計算しています。

SELECT dept_cd,job_id,MAX(age) FROM employee GROUP BY dept_cd,job_id;

MAX:特定のレコードから最大値を求める

MAX関数を使うSQLでも、通常のSELECT文と同じようにWHERE句に条件を書くことが出来ます。

次のSQLでは、WHERE句でDEPT_CDが001または002のレコードを対象として、DEPT_CDグループ化し、最大値を求めています。

SELECT MAX(age) FROM employee WHERE dept_cd in ('001','002');

WHERE句の条件には、EXISTSや副問合せを使うこともできます。
次のSQLではEMPLOYEE表のレコードで、SALES表に該当するレコードが存在するレコードを対象として、AGE列の最大値を求めています。

--EXISTSの例
SELECT
    MAX(a.age)
FROM
    employee a
WHERE
    EXISTS (SELECT
                'x'
            FROM
                 sales b
            WHERE
                 a.id = b.id);

--サブクエリーの例
SELECT
    MAX(a.age)
FROM
    employee a
WHERE
    a.id (SELECT DISTINCT
              b.id
          FROM
              sales b);

MAX:(注意点)NULL値のレコードについて

MAX関数では、NULL値のレコードは最大値の計算に含まれません。

グループ内のレコードが全てNULLの場合は、NULLが返されます。

MIN関数

MIN関数では、最小値を計算したい式または列名を指定します。

MIN関数では数値、文字列、日付型を指定することが出来ます。

GROUP BYを指定しない場合は、SELECT結果全体を1つのグループとして集計します。

MIN(式)

MIN:レコード全体から最小値を求める

レコード全体から最小値を求める場合は、GROUP BYを指定せずにMIN関数を使います。

GROUP BYを使わずにMIN関数を記述した場合、SELECT結果全体を1つのグループとして捉え、SELECT結果全体から最小値を計算します。

SELECT MIN(age) FROM employee;

MIN:グループごとの最小値を求める

次のSQLでは、EMPLOYEE表でdept_cdでグループ化し、AGE列の最小値を計算しています。

SELECT dept_cd,MIN(age) FROM employee GROUP BY dept_cd;

MIN:特定のレコードから最小値を求める

MIN関数を使うSQLでも、通常のSELECT文と同じようにWHERE句に条件を書くことが出来ます。

次のSQLでは、WHERE句でDEPT_CDが001または002のレコードを対象として、DEPT_CDグループ化し、最小値を求めています。

SELECT MIN(age) FROM employee WHERE dept_cd in ('001','002');

WHERE句の条件には、EXISTSや副問合せを使うこともできます。
次のSQLではEMPLOYEE表のレコードで、SALES表に該当するレコードが存在するレコードを対象として、AGE列の最小値を求めています。

--EXISTSの例
SELECT
    MIN(a.age)
FROM
    employee a
WHERE
    EXISTS (SELECT
                'x'
            FROM
                 sales b
            WHERE
                 a.id = b.id);

--サブクエリーの例
SELECT
    MIN(a.age)
FROM
    employee a
WHERE
    a.id (SELECT DISTINCT
              b.id
          FROM
              sales b);

MIN:(注意点)NULL値のレコードについて

MIN関数では、NULL値のレコードは最小値の計算に含まれません。

グループ内のレコードが全てNULLの場合は、NULLが返されます。

SUM関数

SUM関数では、合計値を計算したい数値または列名を指定します。

・DISTINCT/ALL
 DISTINCTを指定すると重複値を除いた合計値を求めます。ALLを指定すると全ての値の合計値を求めます。デフォルト値はALLです。

SUM([DISTINCT | ALL]式)

MIN:レコード全体から合計値を求める

レコード全体から合計値を求める場合は、GROUP BYを指定せずにSUM関数を使います。

GROUP BYを使わずにSUM関数を記述した場合、SELECT結果全体を1つのグループとして捉え、SELECT結果全体から合計値を計算します。

SELECT SUM(age) FROM employee;

MIN:グループごとの合計値を求める

次のSQLでは、EMPLOYEE表でdept_cdでグループ化し、AGE列の合計値を計算しています。

SELECT dept_cd,SUM(age) FROM employee GROUP BY dept_cd;

複数の列でグループ化した結果の合計値を求めることもできます。
次のSQLでは、DEPT_CDとJOB_IDごとのAGE列の合計値を計算しています。

SELECT dept_cd,job_id,SUM(age) FROM employee GROUP BY dept_cd,job_id;

MIN:重複値を除いた合計値を求める

重複値を除く場合は、SUM関数でDISTINCTを指定します。

SELECT SUM(DISTINCT age) FROM employee;

MIN:特定のレコードから合計値を求める

SUM関数を使うSQLでも、通常のSELECT文と同じようにWHERE句に条件を書くことが出来ます。

次のSQLでは、WHERE句でDEPT_CDが001または002のレコードを対象として、DEPT_CDグループ化し、合計値を求めています。

SELECT SUM(age) FROM employee WHERE dept_cd in ('001','002');

WHERE句の条件には、EXISTSや副問合せを使うこともできます。
次のSQLではEMPLOYEE表のレコードで、SALES表に該当するレコードが存在するレコードを対象として、AGE列の合計値を求めています。

--EXISTSの例
SELECT
    SUM(a.age)
FROM
    employee a
WHERE
    EXISTS (SELECT
                'x'
            FROM
                 sales b
            WHERE
                 a.id = b.id);

--サブクエリーの例
SELECT
    SUM(a.age)
FROM
    employee a
WHERE
    a.id (SELECT DISTINCT
              b.id
          FROM
              sales b);

MIN:(注意点)NULL値のレコードについて

SUM関数では、NULL値のレコードは合計値の計算に含まれません。

グループ内のレコードが全てNULLの場合は、NULLが返されます。