Zapytanie sql z podzapytaniem

0

Witam,
zrobiłem taki wycinek bazy : ![niniBaza] http://pokazywarka.pl/vbyzh6/)i mam problem z napisaniem zapytania do niego. Bo musze wypisać 10 najczęściej używanych leków w poprzednim roku (idLeku,nazwaLeku, liczbaZastosowań) które były wykorzystywane co najmniej 1000 razy i uporządkować to według liczby zastosowań. Gdzie liczba zastosowań to po prostu Dawka. Zrobiłem coś takiego lecz nie jestem do końca przekonany czy jest to poprawnie wykonane a nie mam możliwości sprawdzenia tego na bazie danych. Czy mógłby ktoś na to rzucić okiem ?

SELECT TOP 10 X.IdLeku, X.NazwaLeku
FROM ((SELECT Lek.IdLeku, Lek.NazwaLeku, SUM(Lek_Zabieg.Dawka) AS Zastosowanie
        FROM Lek,Zabieg,Lek_Zabieg
        WHERE YEAR( NOW()-YEAR(Zabieg.DataZabiegu))=1 AND Lek.IdLeku=Lek_Zabieg.IdLeku
         AND Zabieg.IdZabieg=Lek_Zabieg.IdZabieg
        GROUP BY Lek.IdLeku, Lek.NazwaLeku)
UNION ALL
        (SELECT Lek.IdLeku, Lek.NazwaLeku,SUM(HLek_Zabieg.Dawka) AS Zastosowanie
         FROM Lek,HistoriaZabieg,HLek_Zabieg
        WHERE YEAR( NOW()-YEAR(HistoriaZabieg.DataZabiegu))=1 AND Lek.IdLeku=HLek_Zabieg.IdLeku
         AND HistoriaZabieg.IdZabiegu=HLek_Zabieg.IdZabiegu
        GROUP BY Lek.IdLeku, Lek.NazwaLeku)) AS X 

GROUP BY  X.IdLeku, X.NazwaLeku, Zastosowanie     
HAVING Zastosowanie>=1000
ORDER BY Zastosowanie
1

Trochę ponarzekam, ale NIENAWIDZĘ zapisawana Join tak jak to robisz, dla osoby czytającej zapytanie jest to po prostu nieczytelne.
W zapytaniu masz kilka błedów:

  1. Błedne nawiasy:
YEAR( NOW()-YEAR(Zabieg.DataZabiegu))=1

Powinno być

YEAR( NOW())-YEAR(Zabieg.DataZabiegu)=1

Ja preferuje zapis, kolumna z tabeli = oczekiwana wartość

YEAR(Zabieg.DataZabiegu)=YEAR( NOW())-1
  1. W kluazuli having powinny być warunki na funkcje agregujące
  2. Kolejność sortownia powinna być malejąca, bo teraz pokażesz 10 najrzadziej uywanych leków

Ogólnie czytelność zapytania nie jest najlepsza, rozumiem, że musisz zrobić uniona, ale niepotrzebnie łączysz każde podzapytanie z abelą leków.
W samej treści masz że musisz uporządkować to po dawce (wynik sumowania) i liczby zastosowań (count) w twoim zapytaniu nie widzę nigdzie count.
Analizując dalej to wydaje mi się, ze liczba zastosowań to nie suma dawek ale ile dawek jest stosowanych do danego leku.
Więc ja bym to zrobił tak:

SELECT TOP 10
	X.IdLeku
	,X.NazwaLeku
FROM
    LEK AS X
	INNER JOIN (
				SELECT
					idLeku
					,Count(*) as il_u
					,Count(distinct Dawka) as il_z
				FROM
					(SELECT
						idLeku
						,Dawka
					FROM
						LekZaieg as LZ
						inner join Zabieg Z on Z.idZabiegu = LZ.idZabiegu
					WHERE
						 YEAR(Z.DataZabiegu)=YEAR(NOW())-1
					UNION ALL
					SELECT
						idLeku
						,Dawka
					FROM
						HistoriaLekZaieg as LZ
						inner join HistoriaZabieg Z on Z.idZabiegu = LZ.idZabiegu
					WHERE
						 YEAR(Z.DataZabiegu)=YEAR(NOW())-1) as agg
				GROUP BY
					idLeku
				HAVING
					COUNT(*) > 999
				) W ON W.idLeku=X.idLeku
ORDER BY
	IL_U DESC
	,IL_Z
0

a jeszcze mam pytanie dlaczego oddałeś to: ,COUNT(*) AS il_u ,COUNT(DISTINCT Dawka) AS il_z

W swoim pytaniu mówisz o dwóch rzeczach

  1. Lekach najczęściej używanych
  2. Liczbie zastosowań

ad. 1
Dla mnie najczęściej używane to termin, który wymaga sprawdzenia ILE RAZY był stosowany dany lek, więc zliczam ilość wystąpień w obu tabelach, stąd

COUNT(*) AS il_u

il_u: ilość użyć

ad.2

Liczba zastosowań, to dla mnie nie jest jednoznaczne, ty użyłeś sumy dla pola dawka, dla mnie to liczba w jakich dawkach lek jest stosowany.

Jeżeli np, mam brać syrop w dawce 5ml przez 7 dni, a ktoś inny ma brać 5/ml przez 5 dni to zastosowana jest ta sama dawka.

Obrazowo:
Pole dawka ma wartości: 1,1,2,3,2,3,1

Dla mnie są trzy zastosowania, dla ciebie 13, bo uzyłeś SUM

Dlatego:

COUNT(DISTINCT Dawka) AS il_z 

il_z: ilość zastosowań

Jeżeli nie rozumiesz co znaczy distinct w funkcji COUNT:
To sprawia, że zliczane są unikatowe wartości, czyli ze zbioru 1,1,2,3,2,3,1
count(distinct pole) zwróci 3 ponieważ są trzy unikalne wartości 1,2,3
, natomiast count(pole) zwróci 7 bo tyle jest wystąpień

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