2015-11-22 5 views
1

У меня есть две таблицы для посещения пациента, а другая - для посещения. Я терпеливый визит от 10 до 70 в таблице поиска.Получить счетчик отсутствующих записей между двумя таблицами (SQL Server 2012)

Некоторые пациенты пропустили визиты в регулярное расписание. Скажите, что пациент пришел на визиты 10, 20, 30, 60 и 70. Таким образом, 40 и 50 будут пропущены.

Я хочу вернуть пациентов, у которых были пропущенные визиты.

Я попытался уйти соединять и подпросить, однако он возвращал мне только те записи в таблице пациентов.

Ниже приведен запрос, который я использовал и снимок экрана моего вывода.

SELECT Patient, vl.Visit, vl.VisitName FROM dbo.PatientVisit p LEFT OUTER JOIN dbo.Visitlookup vl ON p.VisitName = vl.VisitName 
order BY p.Patient, vl.Visit 


SELECT A.Patient, B.visit FROM 
(SELECT Patient, Visit, VisitName FROM dbo.PatientVisit)A, 
(SELECT Visit, VisitName FROM dbo.Visitlookup v1 WHERE v1.Visit NOT IN (SELECT Visit FROM dbo.PatientVisit v))B 
WHERE A.Visit <> B.Visit 

Left Join Output

Может кто-нибудь помочь мне в получении номера пациента и визиты они пропустили?

Адрес sql fiddle.

ответ

1

Это позволит решить вашу проблему

SELECT A.Patient 
     ,B.Visit 
    FROM dbo.PatientVisit AS A 
    INNER JOIN dbo.Visitlookup AS B ON NOT EXISTS (SELECT NULL 
                 FROM dbo.PatientVisit p1 
                 WHERE A.Patient = p1.Patient 
                  AND B.Visit = p1.Visit) 
             AND A.Visit <> B.Visit 
    GROUP BY A.Patient 
     ,B.visit 
    HAVING B.Visit <> MAX(A.Visit) 
1

Вы можете получить Missing пациента, визит, VisitName из запланированных двух таблиц из ниже запроса:

SELECT DISTINCT P.Patient, v.Visit, v.VisitName 
FROM PatientVisit AS p 
CROSS JOIN Visitlookup AS v 
--WHERE p.Patient = 101 
EXCEPT 
SELECT DISTINCT P.Patient, v.Visit, v.VisitName 
FROM PatientVisit AS p 
JOIN Visitlookup AS v 
    ON v.Visit = p.Visit 
--WHERE p.Patient = 101 

Вы можете получить счетчик Отсутствующие Количество пациента Визиты из ниже запроса:

SELECT p.Patient, COUNT(p.Visit) AS MissingVisitCount 
FROM PatientVisit AS p 
GROUP BY p.Patient 
HAVING COUNT(p.Visit) != (SELECT COUNT(1) FROM Visitlookup) 

Надеюсь, они вам будут полезны.