Pomoc zapytanie SQL Oracle

0

Witam,

proszę o pomoc lub radę w napisaniu instrukcji SELECT.

Znajdź liczbę pracowników zarabiających więcej niż wynosi średnia pensja w ich dziale oraz średnią pensję takich pracowników w każdym dziale, w którym minimalna pensja
jest wyższa od minimalnej pensji w dziale nr 20. Ponadto zapytanie ma wyświetlić numer i nazwę działu oraz liczbę pracowników i średnią pensję w każdym dziale, a jego wynik ma być posortowany malejąco według liczby pracowników zarabiających więcej niż wynosi średnia pensja w ich dziale.

Struktura Tabel:

departments
DEPARTMENT_ID : DEPARTMENT_NAME : MANAGER_ID : LOCATION_ID
10 : Administr : 200 : 1700
20 : Buyers : 201 : 1800
... : ... : ... : ...

employees
EMPLOYEE_ID : FIRST_NAME : LAST_NAME : SALARY : DEPARTMENT_ID : DEPARTMENT_NAME
1000 : Mark : Win : 4000 : 20 : Sale
1001 : John : Beck : 3490 : 50 : Marketing
... : ... : ... : ... : ... : ...

Proszę o sugestię, z góry dzięki.

W każdym dziale znajdę pracowników, którzy zarabiają więcej niż wynosi średnia pensja w ich dziale więc dla każdego działu wyświetli mi się co najmniej jedna osoba. Ale jak do tego dodać średnią pensję pracowników w których działach minimalna pensja jest wyższa od tej w dziale 20 ?
Wtedy dla reszty pracowników, którzy nie spełniają warunków wyświetli się w wierszu wartość 0 ?

na razie mam
select department_id, department_name, avg(salary) from employees group by department_id, department_name having min(salary)>(select min(salary) from employees where department_id=20) order by department_id;

Należy wykorzystać CASE ?

0

wrzuć przykładowe dane na sqlfiddle.com

1
/*
Znajdź liczbę pracowników zarabiających więcej niż wynosi 
średnia pensja w ich dziale 
oraz średnią pensję takich pracowników w każdym dziale
*/
select employee_id, first_name, last_name, salary,  department_id, avg(salary) over(partition by department_id) from (
select 
  employee_id, first_name, last_name, salary, 
  department_id, avg(salary) over(partition by department_id) srednia_dzialu
 from employees
 ) sub 
 where salary>srednia_dzialu;

Ale to chba źle... za długie zdania polecenia, które można inaczej interpretować.
Zresztą w jednym zapytaniu chyba całości się nie da...

0

Właśnie tu jest problem, wszystko ma być w jednym select. Rozkminiam to już 3 dzień i nic ale dzięki :)

0

Myślę, że to coś w ten deseń: http://sqlfiddle.com/#!4/ead17/17

0

SELECT department_id, department_name, ilosc_prac, count(department_id) as zarabiajacy_wiecej, avg(salary) as srednia_zar_wiecej, rednia_dzial from (SELECT el.department_name, count(el.last_name) as ilosc_prac, el.department_id, el.salary, avg(e.salary) as srednia_dzial from employees el, employees e where el.department_id=e.department_id group by el.last_name, el.salary, el.department_name, el.department_id, e.department_id having el.salary>avg(e.salary) order by el.department_id) group by department_id, department_name, srednia_dzial, ilosc_prac order by zarabiajacy_wiecej;

Liczy średnią pensję w danym dziale i średnią pensję pracowników zarabiających więcej niż średnia pensja w ich dziale, jedynie coś mi nie gra i zastanawiam się jak do tego dodać średnią pensję takich pracowników w każdym dziale, w którym minimalna pensja jest wyższa od minimalnej pensji w dziale nr 20
Może operator UNION pomoże próbuje dalej :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1