Wypisanie w jednym poleceniu SELECT kilku funkcji grupujacych

0

Witam jestem nowy w temacie SQL i mam takie zadanie:
Dla każdego lekarza wypisz w jednym poleceniu jego imie,nazwisko,liczbe wizyt oraz średnią liczbę wizyt dla lekarzy jego specjalizacji.

Wymyslilem cos takiego

SELECT imie, nazwisko, count(*)
  FROM Lekarz
    INNER JOIN wizyty ON Lekarz.idLekarza = wizyty.IdLekarza
      GROUP BY imie, nazwisko;

ale nie wiem jak wyswietlic ta srednia liczbe wizyt dla lekarzy z jego specjalizacji..

I przy okazji czy to jest poprawne dla zadania:
dla kazdej specjalizacji znajdz imie i nazwisko lekarza z najmniejsza pensja

SELECT imie, nazwisko FROM Lekarz WHERE pensja IN (
  SELECT min(pensja) FROM Lekarz GROUP BY Specjalizacja);

bo co by bylo gdyby w innej grupie byl czlowiek o tej samej pensji co w poszukiwanej grupie.

W zalacziku jest schamt Encji

0

W pierwszym zapytaniu możesz np. użyć window function (albo zrobić dodatkowy JOIN), przy okazji zrobiłem poprawkę, na wypadek gdyby jakiś lekarz nie miał wizyt.

SELECT l.imie,
l.nazwisko
, COALESCE(COUNT(*), 0) as liczba_wizyt
, AVG(case when idPacjenta is not null then 1 else 0 end), 0 OVER (PARTITION BY specjalizacja) AS avg_liczba_wizyt
FROM Lekarz l
LEFT JOIN wizyty w ON l.idLekarza = w.IdLekarza
GROUP BY imie, nazwisko;

W drugim twoje wątpliwości są słuszne, możesz to np. policzyć w taki sposób:

select imie, nazwisko
from lekarz l 
inner join (
	select specjalizacja, min(pensja) as min_pensja
	from lekarz
	group by specjalizacja
) l_agg on (l.specjalizacja = l_agg.specjalizacja and l.pensja = l_agg.min_pensja);

EDIT: wycofuję się z pierwszej wersji zapytania, nie zwróci poprawnej średniej, za chwilę wrzucę poprawkę.
EDIT II: poprawka zrobiona.
EDIT III: w tabeli Wizyty nie ma klucza idWizyty?

0

Zapomnialem dodac ze robie w ORACLI(jesli ma to jakies znaczenie) Dla tego drugie wymyslilem sposob z korelacja i po sprawdzeniu wydaje sie ok:

SELECT imie, nazwisko, specjalizacja, pensja FROM Lekarz a WHERE pensja IN (
  SELECT min(pensja) FROM Lekarz b WHERE a.Specjalizacja = b.Specjalizacja GROUP BY Specjalizacja );

A w tym pierwszym niestety nie udalo mi sie pomyslnie wykonac zapytania.
Zgodnie ze wskazowkami profesora posluzylem sie podzapytaniami i uzyskalem cos takiego

SELECT imie, nazwisko, specjalizacja, count(*) AS "WIZYTY",(
  SELECT avg(count(*)) FROM Lekarz b INNER JOIN wizyty ON b.idLekarza = wizyty.IdLekarza
      WHERE b.Specjalizacja = a.Specjalizacja GROUP BY specjalizacja
) AS "Average"
  FROM Lekarz a
    INNER JOIN wizyty ON a.idLekarza = wizyty.IdLekarza
      GROUP BY imie,nazwisko,specjalizacja;

Niestety w tym momencie avg(count(*)) wylicza mi sume wizyt a nie srednia. (moge ominac avg wynik bedzie ten sam)
Dlaczego przeciez to tez koreluje b z a:(

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