zapytania do bazy z podzapytaniami i złożonym złączeniem

0

Witam
Muszę wyciągnąć z bazy następujące rzeczy:

  1. Nazwisk managerów (last_name), ich wypłat oraz ilości pracowników, którzy są do nich przypisani (podpowiedź: użyj podzapytania do stworzenia osobnej tabeli, w której są numery kierowników i ilości ich pracowników, którą łączymy z tabelą employees poprzez JOIN ON, a ilość pracowników z podzapytania do zapytania głównego przenosimy poprzez alias.)

  2. Nazwisk pracowników (last_name) oraz ich wypłat (salary), którzy nie są kierownikami, a zarabiają więcej niż ich szefowie. UWAGA! Wykorzystując klauzulę “NOT IN” musimy zapewnić interpreter, że lista nie posiada pustych wartości, inaczej zapytanie nie wyświetli wyników! (np. poprzez dodanie warunku WHERE cośtam > 0 ;) )

  1. Zapisałem dwa zapytania; pierwsze wyciąga ogólnie nazwiska i wypłaty pracowników:
select last_name, salary from employees;

Drugie wyciąga id managera i ilość przypisanych do niego ludzi:

select manager_id, count(employee_id) from employees group by manager_id;

Ale jak to połączyć to nie mam pojęcia.
Za drugie się nawet nie zabierałem.
Proszę o pomoc.
Pozdr

0

Jedynka to będzie coś w stylu:

SELECT
   e.last_name,
   e.salary,
   m.emp_qty  
FROM
   employees e     
JOIN
   (
      SELECT
         e1.manager_id,
         COUNT(e1.employee_id) emp_qty        
      FROM
         employees  e1         
      GROUP BY
         e1.manager_id     
   ) m          
      ON e.employee_id=m.manager_id;
0

Kurcze akurat sam do tego doszedłem ale teraz przynajmniej mam pewność że dobrze ;) Dzięki wielkie!

  1. Próbowałem tak:
SELECT last_name, salary FROM employees WHERE (employee_id NOT IN (SELECT manager_id FROM employees WHERE manager_id IS NOT NULL)) AND (salary > (SELECT m.salary FROM employees E JOIN (SELECT manager_id, salary FROM employees) M ON M.manager_id = E.manager_id));

Wypisuję "nie kierowników" ale już porównanie wypłat tych którzy nie są kierownikami, a zarabiają więcej niż ich szefowie kończy się błędem. Co robię źle?

0

Trochę czasu upłynęło ale może jeszcze się przyda.

Ten drugi warunek w twoim przypadku jest błędny ponieważ nie może porównać jednej wartości do wielu:

 salary > (SELECT m.salary FROM employees E JOIN (SELECT manager_id, salary FROM employees) M ON M.manager_id = E.manager_id)

Wystarczy go zastąpić podzapytaniem skorelowanym i powinno działać:

SELECT e1.last_name,
       e1.salary
FROM employees e1
WHERE e1.employee_id NOT IN
    (SELECT e2.manager_id
     FROM employees e2
     WHERE e2.manager_id IS NOT NULL)
  AND e1.salary >
    (SELECT e3.salary
     FROM employees e3
     WHERE e3.employee_id=e1.manager_id );

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