Grupowanie przez GROUP BY oraz podzapytania

0

Mam kilka pytań odnośnie GROUP BY i Podzapytań.

  1. Dajmy na to, że mam pracownika, który ma pola: imie, nazwisko, wiek, adres_zamieszkania.
    Jest on połączony z innymi tabelami zwykłymi JOINami w tym do np. faktury. Ilość faktur wyznacza ilość sprzedanych rzeczy przez tego pracownika. Dajmy na to, że chce wypisać pracowników, którzy sprzedali ponad średnią normę, tzn sprzedali więcej niż średnia faktur.
SELECT imie, nazwisko, wiek, adres_zamieszkania, count(id_faktura)
FROM faktura JOIN pracownik USING(id_pracownik)
HAVING count(id_faktura) > avg(id_faktura)
GROUP BY... 

No właśnie. Jeśli chciałbym użyć tutaj GROUP BY musiałbym podać wszystkie pozycje z selectu tj imie, nazwisko, wiek, adres_zamieszkania bo inaczej wywala mi no-group group... Tyle, że nie moge grupować przez tyle rzeczy. Jak zliczyć liczbę faktur inaczej niż count i group by albo czy da się jakoś uprościć tego group by ?

  1. Jak "wyciągnąć" to co chce z podzapytania np :
SELECT imie, nazwisko, l_faktura
FROM pracownik, faktura, 
(
SELECT count(id_faktura) l_faktura FROM faktura
)WHERE pracownik.id_pracownik = faktura.id_faktura;

Niestety powyższy kod daje mi iloczyn kartezjański (podwaja mi wyniki).

0

1)tworzysz tabele której użyjesz jako podzapytanie, do inner joina:

select idprac,count(idprac) as number
from faktura
group by idprac
having count(idprac)>
(select avg(n) from (
Select count(c.idprac) as n
from faktura as c
group by c.idprac) as B )) as f

2:Tworzysz joiny i wychodzi Ci to czego oczekujesz:

Select p.idprac, p.name, p.surname,number
from pracownik as p
inner join (
select idprac,count(idprac) as number
from faktura
group by idprac
having count(idprac)>
(select avg(n) from (
Select count(c.idprac) as n
from faktura as c
group by c.idprac) as B )

) as f
on p.idprac=f.idprac

Stworzyłem swoje tabele także sprawdź nazyw kolumn, tabel etc.

Jeszcze jedna rzecz:

avg(id_faktura)<<<<<< To nie zwróci Ci średniej liczby faktur na pracownika(napisałeś "więcej niż średnia liczba faktur, a więc przyjąłem, że chodzi Ci o średnią liczbę faktur na pracownika), a jedynie średnią z kolumny id_faktura.
Zmieniłem to w swoim zapytaniu.

W razie pytań, pytaj... ;-)

Pozdrawiam ;-)

0
SELECT p.imie, p.nazwisko, count(id_pracownika) FROM pracownik p JOIN faktura f ON p.id_pracownika=f.id_faktura
GROUP BY id_pracownika
HAVING count(id_pracownika) > (SELECT AVG(q.ilosc) FROM (SELECT count(id_pracownika) AS ilosc FROM pracownik p JOIN faktura f ON p.id_pracownika=f.id_faktura
GROUP BY id_pracownika ) AS q)

Na pewno da się prościej, później sprawdzę.

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