Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL][Oracle]Pomoc PL/SQL, Proszę o pomoc/naprowadzenie na rozwiązanie Select
K1cek
post 26.07.2017, 09:54:25
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 26.07.2017

Ostrzeżenie: (0%)
-----


Witam,

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

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.
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 wg liczby
pracowników zarabiających więcej niż wynosi średnia pensja w ich dziale.

2. 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.
Go to the top of the page
+Quote Post
Pyton_000
post 26.07.2017, 10:00:11
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Nie odrabiamy prac domowych. Pokaż co już masz i z czym masz problem.

Poza tym w sieci jest pełno podobnych zadań. Poszukaj a oświeci Cię.
Go to the top of the page
+Quote Post
K1cek
post 26.07.2017, 10:08:04
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 26.07.2017

Ostrzeżenie: (0%)
-----


Co już mam:

SELECT e1.last_name, e1.department_id, e1.salary, avg(e.salary), from employees e1, employees e
WHERE e1.department_id=e.department_id GROUP BY e1.last_name, e1.salary, e1.department_id, e.department_id
ORDER BY e1.department_id;

Daje mi to imiona, id departamentu pensje danego pracownika i średnią pensję w jego dziale.

Teraz próbuje przekształcić tego selecta by zliczył last_name i pokazał ilu takich pracowników zarabia więcej niż średnia w jego dziale,
nietety bez powodzenia.

Ten post edytował K1cek 26.07.2017, 10:09:43
Go to the top of the page
+Quote Post
Pyton_000
post 26.07.2017, 10:14:11
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Musisz tam wpleść jeszcze COUNT i HAVING
Go to the top of the page
+Quote Post
trueblue
post 26.07.2017, 10:19:24
Post #5





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Musisz użyć podzapytania.
Kolokwium dziś?


--------------------
Go to the top of the page
+Quote Post
K1cek
post 26.07.2017, 10:46:02
Post #6





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 26.07.2017

Ostrzeżenie: (0%)
-----


Są wakacje więc kolokwium brak, ale te zadania dostałem do przerobienia na sesję poprawkową, nie byłem pilnym uczniem więc siedzę i czytam 2-gi dzień, w końcu na to wpadnę smile.gif

SELECT count(distinct e1.last_name), e1.department_id, e1.salary, avg(e.salary), from employees e1, employees e
WHERE e1.department_id=e.department_id GROUP BY e1.last_name, e1.salary, e1.department_id, e.department_id
ORDER BY e1.department_id;

Zlicza w taki sposób:

count(distinctel.last_name) : department_id : salary : avg(e.salary)
1 : 90 : 2400 : 1900
1 : 100 : 7700 : 8600
1 : 100 : 7800 : 8600

Więc teraz próba przekształcenia tak, by department_id się nie dublowało za to zliczyło te jedynki ;-)
Go to the top of the page
+Quote Post
trueblue
post 26.07.2017, 11:02:46
Post #7





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Grupowanie po danej kolumnie i jednocześnie użycie na niej funkcji agregującej jest nielogiczne.


--------------------
Go to the top of the page
+Quote Post
K1cek
post 26.07.2017, 11:52:04
Post #8





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 26.07.2017

Ostrzeżenie: (0%)
-----


SELECT e1.last_name, e1.department_id, e1.salary, avg(e.salary), from employees e1, employees e
WHERE e1.department_id=e.department_id GROUP BY e1.last_name, e1.salary, e1.department_id, e.department_id HAVING e1.salary>avg(e.salary)
ORDER BY e1.department_id;

Ok są pracownicy którzy zarabiają więcej niż średnia w ich działach, jak to zliczyć ? Jakieś sugestie ?

DEPARTMENT_ID : SALARY : AVG(SALARY)
80 : 12400 : 9000
80 : 15000 : 9000
90 : 24000 : 19000
100 : 16000 : 8600
100 : 16000 : 8600
Go to the top of the page
+Quote Post
trueblue
post 26.07.2017, 12:04:22
Post #9





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Jeszcze raz:
1. Podzapytanie oblicza średnią dla każdego działu.
2. Zapytanie główne wybiera pracownika z danego działu z warunkiem na pensję większą od średniej w tymże dziale.


--------------------
Go to the top of the page
+Quote Post
K1cek
post 26.07.2017, 12:56:12
Post #10





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 26.07.2017

Ostrzeżenie: (0%)
-----


SELECT department_id, COUNT (department_id), srednia from (
SELECT e1.last_name, e1.department_id, e1.salary, avg(e.salary) as srednia, from employees e1, employees e
WHERE e1.department_id=e.department_id GROUP BY e1.last_name, e1.salary, e1.department_id, e.department_id HAVING e1.salary>avg(e.salary)
ORDER BY e1.department_id)
GROUP BY department_id, srednia;

Takie zapytanie jest chyba poprawne, chodziło Ci o to że jest zbyt skomplikowane ?

Ten post edytował K1cek 26.07.2017, 13:01:41
Go to the top of the page
+Quote Post
trueblue
post 26.07.2017, 13:19:01
Post #11





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Podzapytanie w środku ma liczyć tylko średnią per dział.


--------------------
Go to the top of the page
+Quote Post
mmmmmmm
post 26.07.2017, 22:12:03
Post #12





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


Mozesz rownież użyć funkcji analitycznych.
SELECT imie, nazwisko, placa, dzial, avg(placa) over(partition by dzial) from ...
Go to the top of the page
+Quote Post
K1cek
post 27.07.2017, 10:09:06
Post #13





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 26.07.2017

Ostrzeżenie: (0%)
-----


Okej dzięki, 3 zadanie spróbuje wykonać zgodnie z waszymi radami, może nieelegancko ale zadanie 2 gotowe.

SELECT department_id, department_name, pracownicy, count(department_id) as pracow, avg(salary), srednia from (
SELECT e1.department_name, count(e1.last_name) as pracownicy, e1.department_id, e1.salary, avg(e.salary) as srednia FROM employees e1. employees e WHERE e1.department_id=e.department_id GROUP BY e1.last_name, e1.salary, e1.department_name, e1.department_id, e.department_id HAVING e1.salary>avg(e.salary) ORDER BY e1.department_id) GROUP BY department_id, department_name, srednia, pracownicy ORDER BY pracow;

Mile widziane konkretne pomysły na uproszczenie, najlepiej okraszone stosownym kawałkiem kodu biggrin.gif

Ten post edytował K1cek 27.07.2017, 10:12:03
Go to the top of the page
+Quote Post
trueblue
post 27.07.2017, 10:13:36
Post #14





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Podzapytanie ma obliczać tylko i wyłącznie średnią na dział. Na jednej tablicy. Czyli wynikiem ma być id_dzial i średnia pensji.


--------------------
Go to the top of the page
+Quote Post
mmmmmmm
post 27.07.2017, 10:30:58
Post #15





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


  1. SELECT department_id, department_name, ast_name, salary, avg(salary) over(partition BY department_id) srednia FROM employee

I z tego wybierasz co chcesz...
Go to the top of the page
+Quote Post
K1cek
post 27.07.2017, 12:26:06
Post #16





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 26.07.2017

Ostrzeżenie: (0%)
-----


Cytat(trueblue @ 27.07.2017, 11:13:36 ) *
Podzapytanie ma obliczać tylko i wyłącznie średnią na dział. Na jednej tablicy. Czyli wynikiem ma być id_dzial i średnia pensji.


Tak z czystej ciekawości, moje zapytanie pokazuje poprawne wyniki i spełnia wszystkie warunki zadania.
Możliwe, że Twoje rozwiązanie jest pod pewnymi względami lepsze ale prosiłbym o jakieś konkrety ?
Go to the top of the page
+Quote Post
trueblue
post 27.07.2017, 13:02:05
Post #17





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


W podzapytaniu nie jest potrzebna informacja o pracowniku. To proste zapytanie grupujące i obliczające średnią per dział.
Potem takie podzapytanie spinasz z głównym zapytanie poprzez id_dzial z warunkiem na płaca>średnia_płaca. Masz wszystkich pracowników, którzy zarabiają powyżej średniej w dziale. Jeśli chcesz obliczyć ile jest takich pracowników w danym dziale, to grupujesz per dział i zliczasz id_pracownik.


--------------------
Go to the top of the page
+Quote Post
K1cek
post 2.08.2017, 12:07:17
Post #18





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 26.07.2017

Ostrzeżenie: (0%)
-----


A macie jakieś pomysły jak poradzić sobie z 3 zadaniem ?


Nikt nic nie poradzi ? Może jakaś sugestia ?

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 ?

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;

Należy wykorzystać CASE ? Może UNION ?

Ten post edytował K1cek 3.08.2017, 08:35:46
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 05:03