WHERE句の述部で集約を指定することはできません。派生テーブルでは、そのような計算を簡単に実行することができます。
次の例で、派生テーブルがどのようにこれを行なうかを示します。
この例では、WHERE条件は、基本テーブルemployeeの行の値を、派生テーブルworkersの列average_salaryの値(この場合は単一の値)と比較しています。
SELECT name, salary, average_salary FROM (SELECT AVG(salary) FROM employee) AS workers (average_salary), employee WHERE salary > average_salary ORDER BY salary DESC;
この問合わせは、以下のような応答セットを返します。
名前 | salary | average_salary |
---|---|---|
Russel S | 55,000.00 | 38,147.62 |
Watson L | 56,000.00 | 38,147.62 |
Phan A | 55,000.00 | 38,147.62 |
Aguilar J | 45,000.00 | 38,147.62 |
Carter J | 44,000.00 | 38,147.62 |
以下のそれよりも複雑な例では、同じ情報をdept_no別にグループに分けています。この例では、文はそれぞれの部門の平均を上回るすべての給与を返します。
この例では、派生テーブルは、一連の行を提供する「グループ テーブル」です。外側のWHERE句では、基本テーブルemployeeと派生テーブルの部門番号(dept_no)の間に等価結合があります。
SELECT name, salary, dept_no, average_salary FROM (SELECT AVG(salary), dept_no FROM employee GROUP BY dept_no) AS workers (average_salary,dept_num), employee WHERE salary > average_salary AND dept_num = dept_no ORDER BY dept_no, salary DESC;
応答セットは次のようになります。
name | salary | dept_no | average_salary |
---|---|---|---|
Chin M | 38,000.00 | 100 | 32,625.00 |
Moffit H | 35,000.00 | 100 | 32,625,00 |
Russel S | 55,000.00 | 300 | 47,666.67 |
Phan A | 55,000.00 | 300 | 47,666.67 |
Watson L | 56,000.00 | 500 | 38,285.71 |
Carter J | 44,000.00 | 500 | 38,385.71 |
Smith T | 42,000.00 | 500 | 38,285.71 |
Aguilar J | 45,000.00 | 600 | 36,650.00 |