2016-11-25 2 views
0

У меня есть две таблицы данных Сотрудники и отделы. Я хочу показать количество сотрудников в каждом отделе, в среднем среди зарплат в каждом отделе. Код у меня есть:Incoorect Count Results

select d.department_id, d.department_name, count(e.last_name) Employees, 
avg(e.salary) Avg_Salary, e.last_name, e.salary, e.job_id 
from departments d, employees e 
where d.department_id = e.department_id 
group by d.department_id, d.department_name, e.last_name, e.salary, e.job_id 
order by d.department_id; 

Этот код прекрасно работает, но результаты для подсчета работников и средней заработной платы не то, что я ищу. Мои результаты:

Department_ID Department_Name Employees Avg_Salary Last_Name Salary Job_ID 
------------- --------------- --------- ---------- --------- ------ ------ 
10   Administration 1   4400  Whalen 4400 AD_ASST 
20   Marketing  1   6000  Fay  6000 MK_REP 
20   Marketing  1   13000  Hartstein 13000 MK_MAN 

Как вы можете видеть, сотрудники подсчитывают отображение 1 для каждого сотрудника, а не общее количество в каждом отделе; и Avg_Salary - это то же самое, что и зарплата, а не фактическая средняя заработная плата в каждом отделе.

Это результаты, которые я хочу:

Department_ID Department_Name Employees Avg_Salary Last_Name Salary Job_ID 
------------- --------------- --------- ---------- -------- ------ ------ 
10    Administration 1   4400  Whalen 4400 AD_ASST 
20    Marketing  2   9500  Fay  6000 MK_REP 
20    Marketing  2   9500  Smith  13000 MK_MAN 

Как это исправить?

ответ

1

Это должно сделать это - с помощью аналитических функций:

select d.department_id, d.department_name, 
     count(e.last_name) over (partition by d.department_id) Employees, 
     avg(e.salary) over (partition by d.department_id) Avg_Salary, 
     e.last_name, e.salary, e.job_id 
from departments d, employees e 
where d.department_id = e.department_id 
order by d.department_id; 
+0

Спасибо Тони! Это работает! – Tim