Problem z zadaniem z SQL

0

Cześć,
Mam do zrobienia zadanie z taką treścią:
Utwórz dwa nowe zespoły o nazwach PIERWSZY i DRUGI, gdzie adres pierwszego zespołu będzie taki sam jak adres zespołu o najmniejszej średniej płacy pracowników, a adres drugiego zespołu będzie taki jak adres zespołu o największej liczbie pracowników. Tworzenie każdego z zespołów należy wykonać jednym poleceniem. W nowych zespołach wstaw po dwóch pracowników z płacami podstawowymi 3000 i 4000. Za pomocą jednego polecenia uśrednij płace pracowników pod każdym adresem. Zweryfikuj poprawność danych po modyfikacji.

Aktualnie, co udało mi się wykonać (mam nadzieję, że poprawnie):

--utworzenie zespolu PIERWSZY
INSERT INTO zespoly(id_zesp, nazwa, adres)
VALUES (
(SELECT MAX(id_zesp)+1 FROM zespoly),
'PIERWSZY',
(SELECT adres FROM zespoly NATURAL JOIN pracownicy GROUP BY id_zesp,adres
HAVING AVG(placa_pod) = (SELECT MIN(AVG(placa_pod)) FROM pracownicy GROUP BY id_zesp))
);

--utworzenie zespolu DRUGI
INSERT INTO zespoly(id_zesp, nazwa, adres)
VALUES (
(SELECT MAX(id_zesp)+1 FROM zespoly),
'DRUGI',
(SELECT adres FROM zespoly NATURAL JOIN pracownicy
GROUP BY id_zesp, adres HAVING COUNT (*) =
(SELECT MAX(COUNT(*)) FROM pracownicy GROUP BY id_zesp))
);
--dodanie pracowników
INSERT INTO pracownicy(id_prac, imie, nazwisko,
placa_pod, id_zesp)
VALUES (
(SELECT MAX(id_prac)+1 FROM pracownicy),
'Stefan',
'Batory',
'3000',
(SELECT id_zesp FROM zespoly WHERE nazwa='PIERWSZY')
);

INSERT INTO pracownicy(id_prac, imie, nazwisko,
placa_pod,id_zesp)
VALUES (
(SELECT MAX(id_prac)+1 FROM pracownicy),
'Kazimierz',
'Wielki',
'4000',
(SELECT id_zesp FROM zespoly WHERE nazwa='PIERWSZY')
);

INSERT INTO pracownicy(id_prac, imie, nazwisko,
placa_pod,id_zesp)
VALUES (
(SELECT MAX(id_prac)+1 FROM pracownicy),
'Mieszko',
'Pierwszy',
'3000',
(SELECT id_zesp FROM zespoly WHERE nazwa='DRUGI')
);

INSERT INTO pracownicy(id_prac, imie, nazwisko,
placa_pod, id_zesp)
VALUES (
(SELECT MAX(id_prac)+1 FROM pracownicy),
'Bolesław',
'Chrobry',
'4000',
(SELECT id_zesp FROM zespoly WHERE nazwa='DRUGI')
);

Nie potrafię natomiast zrobić dalszej części zadania, czyli: > Za pomocą jednego polecenia uśrednij płace pracowników pod każdym adresem

UPDATE pracownicy
SET placa_pod = (
SELECT AVG(placa_pod) FROM pracownicy p NATURAL JOIN zespoly z WHERE z.adres=adres
);
--WHERE????tu powinien być jakiś warunek?

Tyle napisałem, nie wiem czy dobrze podchodzę do problemu.

Skrypt do tworzenia bazy danych, na którym pracuję: http://wazniak.mimuw.edu.pl/images/4/48/Pracownicy.sql

tabela pracownicy:
screenshot-20210607140209.png

tabela zespoly:
screenshot-20210607140239.png

pzdr

0

Zapewne chodziło wykładowcy abyś zrobił select avg(...) from tabela join druga tabela group by adres :)

Natomiast co do jednego polecenia (odnośnie tego co już zrobiłeś) to ja rozumiem tak:
http://sqlfiddle.com/#!4/afb58/16

INSERT INTO zespoly(id_zesp, nazwa, adres)
(
select (SELECT MAX(id_zesp)+1 FROM zespoly),
'PIERWSZY',
(SELECT adres FROM zespoly NATURAL JOIN pracownicy GROUP BY id_zesp,adres
HAVING AVG(placa_pod) = (SELECT MIN(AVG(placa_pod)) FROM pracownicy GROUP BY id_zesp)) adres
from dual
union all
select (SELECT MAX(id_zesp)+2 FROM zespoly),
'DRUGI',
(SELECT adres FROM zespoly NATURAL JOIN pracownicy
GROUP BY id_zesp, adres HAVING COUNT (*) =
(SELECT MAX(COUNT(*)) FROM pracownicy GROUP BY id_zesp)) adres
from dual);

w ten sam sposób zrobiłbym dodawanie użytkowników aby też było w jednym poleceniu. Co do uśredniania płacy to pytanie czy chodzi o płacę z etatów czy pracowników?

Wstępnie wydaje mi się, że tak:

select round(avg(e.placa_do - e.placa_od + e.placa_od),2) sr_etat,
       round(avg(p.placa_pod + p.placa_dod),2) sr_pracownik,
       z.nazwa nazwa_zespolu
  from pracownicy p
  join etaty e on e.nazwa = p.etat
  join zespoly z on z.id_zesp = p.id_zesp
  group by z.id_zesp, z.nazwa;

http://sqlfiddle.com/#!4/89c2be/11

0

@woolfik: Wielkie dzięki za wyjaśnienie części zadania.
Co do uśrednienia, to wydaje mi się, że chodzi o pracowników, gdyż najpierw dodajemy nowych pracowników (zakładam, że nie przydzielamy im etatów, nie ma tego podanego w zadaniu), a potem uśredniamy płace (już wraz z tymi nowododanymi pracownikami).

1

W takim razie coś takiego:

select round(avg(p.placa_pod + nvl(p.placa_dod,0)),2) sr_pracownik,
       z.nazwa nazwa_zespolu
  from pracownicy p
  join zespoly z on z.id_zesp = p.id_zesp
  group by z.id_zesp, z.nazwa;
0

@woolfik: Myślę, że chodzi o coś takiego (się okaże :P) . Zmodyfikowałem trochę Twoje zapytanie.

SELECT round(avg(p.placa_pod),2) sr_pracownik,
      z.adres
  FROM pracownicy p
  JOIN zespoly z on z.id_zesp = p.id_zesp
  GROUP BY z.adres;

W każdym razie, dzięki wielkie za pomoc! Dużo mi pomogłeś :)

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