Problem z zadaniem z SQL

Problem z zadaniem z SQL
Kyub
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Postów:6
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):

Kopiuj
--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

Kopiuj
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

edytowany 1x, ostatnio: Kyub
woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około godziny
  • Postów:1596
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

Kopiuj
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:

Kopiuj
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

edytowany 5x, ostatnio: woolfik
Kyub
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Postów:6
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).

woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około godziny
  • Postów:1596
1

W takim razie coś takiego:

Kopiuj
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;
edytowany 2x, ostatnio: woolfik
Kyub
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Postów:6
0

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

Kopiuj
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ś :)

woolfik
No jak dobrze rozumiem _pod to podstawa i _dod to dodatek czyli wynagrodzenie pracownika równa się podstawa + dodatek ... ale tak jak mówię są to moje domysły, choć bazując na danych w tabelach wydaje mi się, że domysł słuszny
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)