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

question-closed Problem z selectem

Object Storage Arubacloud
0 głosów
357 wizyt
pytanie zadane 6 lutego 2018 w SQL, bazy danych przez EltraEden Użytkownik (590 p.)
zamknięte 6 lutego 2018 przez EltraEden

Witam. W szkole nauczyciel dał nam zadanie do przemyślenia i za każdym razem jak myślę że już jestem blisko to coś się psuje no i teraz stoję w kropce. Otóż dostaliśmy zadanie aby z tabeli Employees wyselektować tylko tych pracowników, którzy mają wyższe zarobki niż średnia zarobków w ich departamencie. Na początku zrobiłem to przy użyciu Case ale nauczyciel powiedział że nie mogę zrobić tego z case. Więc kombinowałem z group by i having ale nie potrafię zrobić tego tak żeby w jednym selekcie wyciągnąć średnią dla każdego departamentu.
Screen z bazy : https://drive.google.com/file/d/1MqzA6-_hr04ndeMmUQw85_2nrA-NAU2e/view?usp=sharingObrazek

komentarz zamknięcia: Znalazłem rozwiązanie mojego problemu.

2 odpowiedzi

0 głosów
odpowiedź 6 lutego 2018 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)

Możesz wyciągnąć dane zapytaniem wyliczającą średnią wartość kolumny:

SELECT AVG(nazwaKolumny)
FROM tabela
WHERE warunek; 

Później, możesz wyciągnąć dane takim zapytaniem:

SELECT * FROM tabela
WHERE  sprzedaz > średniaZarobków;

Takie coś mi przychodzi do głowy

komentarz 6 lutego 2018 przez EltraEden Użytkownik (590 p.)
To tylko średnia całej kolumny a mi chodzi o średnie z grup których numery są w kolumnie.
0 głosów
odpowiedź 6 lutego 2018 przez robRoy Użytkownik (970 p.)
edycja 6 lutego 2018 przez robRoy

Cześć, nie miałem okazji tego sprawdzić, ale powinno działać.
 

SELECT p.*
FROM employees AS p
INNER JOIN (SELECT AVG(salary) AS salary_avg, department_id FROM employee GROUP BY department_id) AS c
ON p.department_id = c.department_id
WHERE p.salary > c.salary_avg;

 

komentarz 6 lutego 2018 przez mbabane Szeryf (79,280 p.)
Zastosuj odpowiedni komponent do wstawiania kodu: ikonka {...} a będzie jak trzeba.
komentarz 6 lutego 2018 przez robRoy Użytkownik (970 p.)
Mój błąd, dzięki za podpowiedź
komentarz 6 lutego 2018 przez plucins Stary wyjadacz (11,110 p.)

@robRoy,

jeżeli mamy agregat jako warunek to powinniśmy użyć HAVING, a nie WHERE.

komentarz 6 lutego 2018 przez robRoy Użytkownik (970 p.)
Jak najbardziej, tylko że w tym przypadku to nie agregat sprawdzamy. On tylko pozwala dadać nowe informacje do tabeli, w której nie następuje już żadne grupawanie, dlatego należy użyć WHERE. Przy użyciu HEAVING wyskoczy błąd, ponieważ nie występuje słowo kluczowe GROUP BY (jest ono w zapyaniu zagnieżdzonym). Czy tak nie jest?
komentarz 6 lutego 2018 przez EltraEden Użytkownik (590 p.)

@robRoy, Niestety wyrzuca taki błąd :

 ORA-00933: SQL command not properly ended
00933. 00000 -  "SQL command not properly ended"
*Cause:    
*Action:
Error at Line: 3 Column: 16

komentarz 6 lutego 2018 przez robRoy Użytkownik (970 p.)
edycja 6 lutego 2018 przez robRoy

Oracle... Nigdy nie używałem Oracle, taka sam konstrukcja zadziałała na mojej postresowej bazie na zbliżonych danych. Spróbuj możne to zmodyfikować według tej notatki (jeśli nie zadziała to niestety nie wiem jak pomóc):

komentarz 6 lutego 2018 przez EltraEden Użytkownik (590 p.)

Znalazłem sposób w  końcu z kolegą przysiedliśmy i wyszło :D

SELECT LAST_NAME,DEPARTMENT_ID,SALARY
FROM EMPLOYEES E
WHERE SALARY > (SELECT AVG(SALARY) FROM EMPLOYEES E2
WHERE E2.DEPARTMENT_ID = E.DEPARTMENT_ID)
ORDER BY DEPARTMENT_ID;

 

komentarz 6 lutego 2018 przez robRoy Użytkownik (970 p.)
Czy jesteś pewien wyniku? W którym miejscu zaznaczasz, że średnią liczysz tylko dla danego departamentu? Używając " SELECT AVG(SALARY) FROM EMPLOYEES " liczysz średnią wszystkich zarobków (ze wszystkich departamentów) i to do niej porównujesz. Gdy usuniesz z zapytania "E2 WHERE E2.DEPARTMENT_ID = E.DEPARTMENT_ID" powinieneś dostać ten sam wynik bo to zapytanie zagnieżdżone i nie musisz zmieniać nazw tabel. Czy tak nie jest?
komentarz 7 lutego 2018 przez EltraEden Użytkownik (590 p.)
Sprawdzaliśmy ręcznie po każdym departamencie i wynik się zgadza.
komentarz 7 lutego 2018 przez EltraEden Użytkownik (590 p.)
Nauczyciel powiedział że to działa przez relacje zwrotną.

Podobne pytania

0 głosów
1 odpowiedź 368 wizyt
pytanie zadane 23 listopada 2019 w PHP przez manager96 Bywalec (2,050 p.)
0 głosów
1 odpowiedź 548 wizyt
+1 głos
1 odpowiedź 309 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...