Problem z zadaniami na studiach - podzapytania

0

Próbuję zrobić te pierwsze zadanie (załącznik screen), jedyne co mam do tej pory to to:

select nazwisko, placa_pod from pracownicy group by nazwisko, placa_pod having placa_pod > (SELECT AVG(placa_pod) from (SELECT id_zesp from pracownicy group by id_zesp having count(*) >=2));

Wyskakuje błąd 'ORA-01427: single-row subquery returns more than one row'
Nawet jest pominięty warunek 'wartość średnią (z dokładnością do 30%)' chcę to po prostu zrozumieć jakoś, ale nie potrafię. Mógłby mi ktoś przybliżyć jak to zrobić?
Tutaj jest tabela: http://wazniak.mimuw.edu.pl/images/4/48/Pracownicy.sql

1

Odpal samo podzapytanie i zwróci ci więcej niż jeden wiersz:

SELECT AVG(placa_pod) from (SELECT id_zesp from pracownicy group by id_zesp having count(*) >=2)

Pewnie trzeba by jeszcze powiązać to podzapytanie z głównym po kluczu do zespołu.

Po drugie to jest bez sensu:

 (SELECT AVG(placa_pod) from (SELECT id_zesp from pracownicy group by id_zesp having count(*) >=2)) 

Najpierw grupujesz pracowników po zespole, a potem liczysz srednią z kolumny której nie wyciągasz w selekcie. Jak chcesz mieś średnia dla zespołu kóre mają wiecje niż dwóch pracowników to zrób tak:

SELECT id_zesp, AVG(placa_pod) from pracownicy group by id_zesp having count(*) >=2) 

Chyba że chodzi o cos innego, to napisz, jaki jest problem, bo może źle do tego podchodzisz.

0
Tomek Pycia napisał(a):

Odpal samo podzapytanie i zwróci ci więcej niż jeden wiersz:

SELECT AVG(placa_pod) from (SELECT id_zesp from pracownicy group by id_zesp having count(*) >=2)

Pewnie trzeba by jeszcze powiązać to podzapytanie z głównym po kluczu do zespołu.

Po drugie to jest bez sensu:

 (SELECT AVG(placa_pod) from (SELECT id_zesp from pracownicy group by id_zesp having count(*) >=2)) 

Najpierw grupujesz pracowników po zespole, a potem liczysz srednią z kolumny której nie wyciągasz w selekcie. Jak chcesz mieś średnia dla zespołu kóre mają wiecje niż dwóch pracowników to zrób tak:

SELECT id_zesp, AVG(placa_pod) from pracownicy group by id_zesp having count(*) >=2) 

Chyba że chodzi o cos innego, to napisz, jaki jest problem, bo może źle do tego podchodzisz.

Dziękuję za odpowiedź. Zrobiłam coś takiego:
Jest to poprawnie? Obecnie mi wychodzi jak mniemam nazwisko i placa_pod > od średnich zarobków w zespołach większych niż > 2.
Tylko jak teraz zrobić to z tym założeniem z 30%? Masz jakiś pomysł?

FROM pracownicy 
WHERE placa_pod >
(SELECT AVG(placa_pod)  
FROM pracownicy ) 
AND  id_zesp IN 
( SELECT id_zesp  
FROM pracownicy 
group by id_zesp
having count(*) >=2)
0

Jaka dobrze rozumiem to zarobki podstawowe mają być w zkresie srednia plus/minus 30% ze średniej.

0
Tomek Pycia napisał(a):

Jaka dobrze rozumiem to zarobki podstawowe mają być w zkresie srednia plus/minus 30% ze średniej.

No tak. Próbowałam to zrobić w taki sposób używająć between i AND, ale nie działa.
'ORA-00923: FROM keyword not found where expected'

FROM pracownicy 
WHERE placa_pod BETWEEN 
(SELECT 0.7AVG(placa_pod)  
FROM pracownicy ) 
AND  id_zesp IN 
( SELECT id_zesp  
FROM pracownicy 
group by id_zesp
having count(*) >=2)
AND (SELECT 1.3AVG(placa_pod)  
FROM pracownicy ) 
AND  id_zesp IN 
( SELECT id_zesp  
FROM pracownicy 
group by id_zesp
having count(*) >=2)
0

Po pierwsze cos takiego nie przejdzie:
0.7AVG(placa_pod) - użyj gwiazdki między tymi składnikami. Po drugie BETWEEN przyjmuje jako parametry zakres połaczony ANDem.
Można do tego podejść troche inaczej -

SELECT nazwisko, placa_pod
FROM pracownicy left join  (SELECT id_zesp, AVG(placa_pod) sred, count(*)  c  from pracownicy group by id_zesp)   as t_sred on (pracownicy.id_zesp = t_sred.id_zesp) 
where pracownicy.placa_pod between t_sred.sred * 0.7  AND  t_sred.sred * 1.3  AND t_sred.c > 2

Pisane be z bazy to może zawierać jakieś błędy.

0
Tomek Pycia napisał(a):

Po pierwsze cos takiego nie przejdzie:
0.7AVG(placa_pod) - użyj gwiazdki między tymi składnikami. Po drugie BETWEEN przyjmuje jako parametry zakres połaczony ANDem.
Można do tego podejść troche inaczej -

SELECT nazwisko, placa_pod
FROM pracownicy left join  (SELECT id_zesp, AVG(placa_pod) sred, count(*)  c  from pracownicy group by id_zesp)   as t_sred on (pracownicy.id_zesp = t_sred.id_zesp) 
where pracownicy.placa_pod between t_sred.sred * 0.7  AND  t_sred.sred * 1.3  AND t_sred.c > 2

Pisane be z bazy to może zawierać jakieś błędy.

ORA-00905: missing keyword

Ale dziękuję, postaram się to jakoś zrozumieć i przestudiować :v

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