SQL - niepoprawne działanie zapytania

0

Cześć mam taką bazę danych

Tabela Wizyty ( IdWizyty, IdLekarza, IdPacjenta, DataWizyty, Oplata)

Tabela Pacjenci (IdPacjenta, Nazwisko, Imie, Pesel, DataUrodzenia, Plec)

Tabela Lekarze (IdLekarza, Nazwisko, Imie , DataUrodzenia, NIP, Plec, IdSpecjalizacji)

Tabela Specjalizacje (IdSpecjalizacji, NazwaSpecjalizacji)

zrobić zestawienie zawierające następujące dane; nazwisko, imię pacjentów, którzy 25 kwietnia 2016 byli u kardiologa lub diabetologa a nie byli u lekarza rodzinnego w całym roku 2016

Oto mój kod:

WITH TMP as
(
select P.Nazwisko,P.Imie,P.Pesel
,sum(CASE WHEN L.Idspecjalizacji = 5 THEN 1 ELSE 0 END) as ileWizytKardiolog
,sum(CASE WHEN L.Idspecjalizacji = 6 THEN 1 ELSE 0 END) as ileWizytDiabetolog
,sum(CASE WHEN L.Idspecjalizacji = 1 THEN 1 ELSE 0 END) as ileWizytRodzinny
from Wizyty as W
inner join Pacjenci as P on W.IdPacjenta=P.IdPacjenta
inner join Lekarze as L on W.IdLekarza=L.IdLekarza
where

year (DataWizyty)=2016
group by P.Nazwisko,P.Imie,Pesel

)
Select *
from TMP
where      ileWizytDiabetolog>0 or ileWizytKardiolog>0 and ileWizytRodzinny=0

O ile latwo znalezc pacjentow ktorzy w calym 2016 nie byli u rodzinnego , to jak znalezc tych ktorzy akurat 2016-04-25 byli o diabetologa lub kardiologa ?

0

Warunek typu:
25 kwietnia 2016 byli u kardiologa lub diabetologa a nie byli u lekarza rodzinnego w całym roku 2016

najłatwiej zapisać jako:
WHERE DataWizyty = 25-04-2016 and ... [sprawdzenie rodzaju lekarza]
AND NOT EXISTS
( ... tu join lekarza rodzinnego z wizytami w roku 2016 + join skorelowany do pacjenta z zapytania głównego)

0
robertos7778 napisał(a):

Warunek typu:
25 kwietnia 2016 byli u kardiologa lub diabetologa a nie byli u lekarza rodzinnego w całym roku 2016

najłatwiej zapisać jako:
WHERE DataWizyty = 25-04-2016 and ... [sprawdzenie rodzaju lekarza]
AND NOT EXISTS
( ... tu join lekarza rodzinnego z wizytami w roku 2016 + join skorelowany do pacjenta z zapytania głównego)

Where DataWizyty='2016-04-25' and ileWizytKardiolog>0 or ileWizytDiabetolog>0
and not exists
select ileWizytRodzinny 
join ileWizytRodzinny as WR
inner join Pacjenci as P
where  DataWizyty=2015 and  ileWizytRodzinny=0

czy coś takiego ? teraz nie sprawdzę tego bo nie mam dostepu do bazy

0
;WITH wizyty_u_rodzinnego_w_2016_cte
AS ( SELECT   IdPacjenta ,
              COUNT(*) ilosc_wizyt_u_rodzinnego
     FROM     wizyty w
              INNER JOIN Lekarze AS L ON w.IdLekarza = L.IdLekarza
     WHERE    YEAR(DataWizyty) = 2016
              AND L.IdSpecjalizacji = 1
     GROUP BY IdPacjenta )
SELECT DISTINCT P.Nazwisko ,
                P.Imie ,
                P.Pesel
FROM   Wizyty w
       LEFT JOIN wizyty_u_rodzinnego_w_2016_cte wr ON wr.IdPacjenta = w.IdPacjenta
       INNER JOIN Pacjenci AS P ON w.IdPacjenta = P.IdPacjenta
       INNER JOIN Lekarze AS L ON w.IdLekarza = L.IdLekarza
WHERE  (   L.Idspecjalizacji = 5
           OR L.Idspecjalizacji = 6 )
       AND DataWizyty = '2016-04-25'
       AND wr.ilosc_wizyt_u_rodzinnego IS NULL;
0
WITH TMP as
(
select distinct 
    P.IdPacjenta
   , P.Nazwisko
   ,P.Imie
   ,P.Pesel
from 
    Wizyty as W
    inner join Pacjenci as P on W.IdPacjenta=P.IdPacjenta
    inner join Lekarze as L on W.IdLekarza=L.IdLekarza
where
 DataWizyty = '2016-04-25'
  and L.Idspecjalizacji in (5,6)
), rod as (select distinct 
    P.IdPacjenta
from 
    Wizyty as W
    inner join Pacjenci as P on W.IdPacjenta=P.IdPacjenta
    inner join Lekarze as L on W.IdLekarza=L.IdLekarza
where
 DataWizyty between '2016-01-01' and '2016-12-31'
  and L.Idspecjalizacji=1
)
select imie, nazwisko
 from tmp 
left join rod on rod.idpacjenta = tmp.idpacjenta
where rod.idpacjenta is null

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