従業員数と平均給与を取得できますが、平均を下回る従業員数をリストする追加選択を取得しようとすると失敗します。
select count(employee_id),avg(salary)
from employees
Where salary < avg(salary);
従業員数と平均給与を取得できますが、平均を下回る従業員数をリストする追加選択を取得しようとすると失敗します。
select count(employee_id),avg(salary)
from employees
Where salary < avg(salary);
問題は、それAVG
が集計関数であることです。SQL は、集計された結果を行内で混合する方法を理解できるほど賢くありません。従来の方法は、結合を使用することです。
select count(*), avg(e.salary),
sum(case when e.salary < const.AvgSalary then 1 else 0 end) as NumBelowAverage
from employees e cross join
(select avg(salary) as AvgSalary from employees) as const
select count(*), (select avg(salary) from employees)
from employees
where salary < (select avg(salary) from employees);
select TotalNumberOfEmployees,
AverageSalary,
count(e.employee_id) NumberOfEmployeesBelowAverageSalary
from (
select count(employee_id) TotalNumberOfEmployees,
avg(salary) AverageSalary
from employees
) preagg
left join employees e on e.salary < preagg.AverageSalary
group by TotalNumberOfEmployees,
AverageSalary
注: LEFT 結合を使用したため、3 人の同等の従業員がいる場合、結果が表示されない (平均以下の従業員はいない) 代わりに 0 が表示されます。
select * from <table name> where salary < (select avg(<salary column name) from <table name>);
例:
select * from EMPLOYEE where sal < (select avg(emp_sal) from EMPLOYEE);
SELECT e.ename,e.deptno,e.sal,d.avg
FROM emp e,(SELECT deptno, avg(sal) avg
FROM emp
GROUP BY deptno) d
WHERE e.deptno=d.deptno
AND
e.sal < d.avg