• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kwerenda nie zwraca poprawnej wartości zarobków większych niż średnie w danej grupie zarobkowej

VPS Starter Arubacloud
0 głosów
400 wizyt
pytanie zadane 25 lipca 2017 w SQL, bazy danych przez Kube Obywatel (1,180 p.)

Mam problem podczas pokazywania wyników złożonego zapytania z podzapytaniami oraz łączeniem tabel. 

Język: Oracle SQL 
Środowisko: SQL Developer 

Schemat tabel poniżej: 

Cały plik: wyszukać po frazie "zadania select dla eds" w google. 1 wynik. Polecam do ćwiczeń ogólnie ten zestaw.

Dla tego zadania podaje tylko istotne objaśnienia tabel: 



EMP - tabela z pracownikami: 
ename - nazwa pracownika 
sal - pensja pracownika 
deptno - numer departamentu, do którego pracownik jest przypisany. Klucz obcy tabeli Dept



DEPT - tabela departamentów: 
deptno - numer departamentu, do którego pracownik jest przypisany. Klucz główny. 
dname - nazwa departamentu



SALGRADE 
Grade – grupa zaszeregowania. Klucz główny. 
Losal – minimalna stawka płacy w danej grupie 
Hisal – maksymalna stawka płacy w danej grupie  

Treść zadania: Podaj nazwisko, pensję i nazwę departamentu pracowników, których płaca przekracza średnią ich grup zarobkowych. Moje zapytanie (troche rozszerzyłem, żeby najpierw sprawdzić czy działa - niestety nie działa):

SELECT ename, sal, dname,grade
from emp 
INNER JOIN dept
ON emp.deptno=dept.deptno
INNER JOIN salgrade
ON emp.sal BETWEEN losal AND hisal
WHERE sal > ANY(SELECT avg(sal)
FROM emp
INNER JOIN salgrade
ON sal BETWEEN losal AND hisal
group by grade)
order by grade desc, sal desc;


 

Dostaję:

Więc zdecydowanie zapytanie zwraca za dużo wyników.

Średnie zarobki dla grup :

I tutaj moje pytania:

1. Co robię źle, że nie zwraca poprawnie wyników?

Jakikolwiek operator logiczny nie wstawię po "WHERE Sal" i tak dostaję to samo.

2. Pomijając błąd, czy moje zapytania są bardzo nieoptymalne?

Dziękuję z góry za każdą podpowiedź.

1 odpowiedź

+1 głos
odpowiedź 25 lipca 2017 przez jeremus Maniak (59,720 p.)
wybrane 25 lipca 2017 przez Kube
 
Najlepsza
cały problem w tym zadaniu jest w tym że powiązanie między pracownikiem a grupa zaszeregowania jest niejawne, dobrze zaprojektowana baza powinna mieć w tabeli pracownicy , pole grupa zaszeregowania, a niestety nie ma , i trzeba określić grupę poprzez sprawdzenie czy pensja mieści się między maksymalna a minimalna wartością grupy zaszeregowania.  Mam nadzieje że w grupach zaszeregowania hisal grupy 1 jest mniejsze niż losal grupy 2 itd.

Bo niestety w życiu jest inaczej :)

 

spróbuj podzapytanie zapisać tak :

WHERE sal > (SELECT avg(sal)

FROM emp ,salgrade

where sal BETWEEN losal AND hisal)
komentarz 25 lipca 2017 przez Kube Obywatel (1,180 p.)

Grupy zaszeregowania mają przedziały losal i hisal, które się nie pokrywają.

Niestety po zmianie podzapytania na zaproponowane dalej nie działa sad

Moje zapytanie po modyfikacji:

SELECT ename, sal, dname,grade
from emp 
FULL OUTER join dept
ON emp.deptno=dept.deptno
FULL OUTER JOIN salgrade
ON sal BETWEEN losal AND hisal
WHERE sal > (SELECT avg(sal)
FROM emp ,salgrade
where sal BETWEEN losal AND hisal)
order by grade desc, sal desc;

Dostaję wyniki:

komentarz 25 lipca 2017 przez jeremus Maniak (59,720 p.)
with srednie as
(SELECT grade,avg(sal) as sr
FROM emp ,salgrade
where sal BETWEEN losal AND hisal group by grade )

SELECT ename, sal, dname,salgrade.grade
from emp ,dept,salgrade,srednie
where
emp.deptno=dept.deptno
and 
 sal BETWEEN losal AND hisal
and sal > sr and salgrade.grade=srednie.grade
order by salgrade.grade desc, sal desc;

-- to powinno działac

komentarz 25 lipca 2017 przez Kube Obywatel (1,180 p.)
Dziękuję bardzo za pomoc. Teraz działa.

Podobne pytania

0 głosów
0 odpowiedzi 268 wizyt
pytanie zadane 18 marca 2020 w Nasze poradniki przez oracledev Użytkownik (620 p.)
0 głosów
0 odpowiedzi 365 wizyt
pytanie zadane 18 stycznia 2020 w Nasze poradniki przez oracledev Użytkownik (620 p.)
+2 głosów
1 odpowiedź 794 wizyt
pytanie zadane 11 stycznia 2020 w Nasze poradniki przez oracledev Użytkownik (620 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...