2015-12-08 3 views
1

В настоящее время я работаю над проектом, в котором у меня есть список пациентов с зубами, и я должен отображать всех пациентов, у которых есть два конкретных кода процедуры, прилагаемых к их профилей. Эти пациенты должны иметь ОБЩИЕ коды процедур, а не тот или иной. Сначала я думал, что смогу выполнить это, используя базовый оператор AND в моем предложении WHERE, например.SQL Query: использование AND/OR в предложении WHERE

SELECT [stuff] 
FROM [this table] 
WHERE ProcedureCode = 'ABC123' AND ProcedureCode = 'DEF456'; 

Запрос конечно ничего не возвращает, потому что коды вводятся в индивидуальном порядке, и вы не можете иметь оба Процедуры 1 и 2 процедуры одновременно.

Я попытался переключить «И» на «ИЛИ» только из любопытства. Конечно, я теперь получаю результаты для пациентов, которые имеют только один код или другие, но у пациентов, у которых оба обнаруживаются также и коды отображаются в виде отдельных результатов, например, так:

Patient ID  Last Name  First Name  Code  Visit Date 

1111111   Doe    Jane    ABC123  11-21-2015 
5555555   Smith   John    ABC123  12-08-2015 
5555555   Smith   John    DEF456  12-08-2015 

Моего В наши дни SQL довольно ржавый. Я пытаюсь найти способ отфильтровать пациентов, таких как Джейн Доу, и включать только таких пациентов, как Джон Смит, у которых есть оба кодекса. Идеи?

ДОБАВЛЕНИЕ ИНФОРМАЦИЯ НА ОСНОВЕ ОТВЕТА Христианина:

Это то, что обновленный запрос выглядит следующим образом:

SELECT PatientID, LastName, FirstName, Code, VisitDate 
FROM VisitInfo 
WHERE PatientID IN 
(
SELECT PatientID 
FROM VisitInfo 
WHERE Code = 'ABC123' OR Code = 'DEF456' 
GROUP BY PatientID 
HAVING COUNT(*) > 1 
) 
AND (Code = 'ABC123' OR Code = 'DEF456'); 

Так что я по-прежнему получать результаты, подобные следующему, когда пациент показывает только один но, возможно, несколько его примеров:

Patient ID  Last Name  First Name  Code  Visit Date 

1111111   Doe    Jane    ABC123  11-02-2015 
1111111   Doe    Jane    ABC123  11-21-2015 
5555555   Smith   John    ABC123  12-08-2015 
5555555   Smith   John    DEF456  12-08-2015 
5555555   Smith   John    ABC123  12-14-2015 
9999999   Jones   Mike    DEF456  11-22-2015 
9999999   Jones   Mike    DEF456  12-06-2015 

Несмотря на то, что Джейн Доу и Майк Джонс имеют 2 результата ts, они оба одинакового кода, поэтому мы не хотим их включать. И хотя у Джона Смита еще 2 одинакового кода, его результаты также включают оба кода, поэтому мы хотим сохранить его и других пациентов, подобных ему.

ДРУГОЙ UPDATE:

Я только что узнал, что я теперь должен включать в себя несколько основных демографических сведений для пациентов, о которых идет речь, поэтому я присоединился к моей VisitInfo таблицу с таблицей PatientInfo. Обновленный запрос выглядит следующим образом:

SELECT v.PatientID, v.LastName, v.FirstName, v.Code, v.VisitDate, p.DateOfBirth, p.Gender, p.PrimaryPhone 
FROM VisitInfo v JOIN PatientInfo p ON v.PatientID = p.PatientID 
WHERE v.PatientID IN 
(
SELECT PatientID 
FROM VisitInfo 
WHERE Code = 'ABC123' OR Code = 'DEF456' 
GROUP BY PatientID 
HAVING COUNT(*) > 1 
) 
AND (Code = 'ABC123' OR Code = 'DEF456'); 

Я не был уверен, что, если новый РЕГИСТРИРУЙТЕСЬ затронет чьи-либо ответы ...

ответ

1

Там куча способов кожи это особенно кошки - вот еще один:

WITH ABC123 AS (SELECT DISTINCT PATIENTID 
        FROM VISITINFO 
        WHERE PROCEDURECODE = 'ABC123'), 
    DEF456 AS (SELECT DISTINCT PATIENTID 
        FROM VISITINFO 
        WHERE PROCEDURECODE = 'DEF456') 
SELECT v.PATIENTID, v.LASTNAME, v.FIRSTNAME, v.PROCEDURECODE, v.VISITDATE, 
     p.DateOfBirth, p.Gender, p.PrimaryPhone 
    FROM VISITINFO v 
    INNER JOIN ABC123 a 
    ON a.PATIENTID = v.PATIENTID 
    INNER JOIN DEF456 d 
    ON d.PATIENTID = v.PATIENTID 
    INNER JOIN PatientInfo p 
    ON v.PatientID = p.PatientID 
    WHERE v.PROCEDURE_CODE IN ('ABC123', 'DEF456') 
    ORDER BY v.PATIENTID, v.VISITDATE, v.PROCEDURECODE; 

Что мы делаем здесь, используя пару КТР, чтобы получить PATIENTID для каждого пациента, который имеет выполняемые процедуры. Затем мы начинаем со всех записей в VISITINFO и внутреннем объединяем те, у кого есть два CTE. Поскольку INNER JOIN требует, чтобы соответствующая информация существовала в таблицах по обеим сторонам соединения, это приводит к сохранению только посещений, которые соответствуют информации в обоих CTE, на основе критериев соединения, которые в этом случае являются PATIENTID.

Удачи.

+0

Хммм. Я думал, что это может сделать трюк, но теперь я получаю коды процедур для ВСЕХ процедур, а не только двух стоматологических, которые я ищу. И, глядя на список идентификаторов пациентов, я теперь пропускаю немало пациентов, которые мне предлагал оригинальный запрос. Я также получил несколько новых инструкций для этого проекта, поэтому я буду обновлять свой вопрос на мгновение ... – EJF

+1

Обновлено добавлением предложения WHERE в основной запрос. –

+0

Ах, потрясающе! Это сработало! Спасибо! – EJF

3
SELECT * 
FROM TABLE 
WHERE Patient_ID IN 
(
SELECT Patient_ID 
FROM TABLE 
WHERE Code = 'ABC123' OR Code = 'DEF456' 
GROUP BY Patient_ID 
HAVING COUNT(*) = 2 
) 
AND (Code = 'ABC123' OR Code = 'DEF456') 

UPDATE 1:

Как пациент может иметь несколько «Кодексы процедур», этот способ будет работать лучше:

SELECT * 
FROM TABLE T1 
WHERE EXISTS (SELECT 1 
       FROM TABLE T2 
       WHERE T1.Patient_ID = T2.Patient_ID 
       AND T2.Code = 'ABC123') 
AND EXISTS (SELECT 1 
       FROM TABLE T2 
       WHERE T1.Patient_ID = T2.Patient_ID 
       AND T2.Code = 'DEF456') 
AND T1.Code IN ('ABC123','DEF456') 
+0

Пробовал это ... запрос теперь возвращает результаты для всех кодов процедуры в системе, а не только для двух, которые мне нужны. В случае первого зарегистрированного пациента существуют коды как для стоматологических, так и для медицинских процедур, но у этого пациента по-прежнему имеется только один из этих двух зубных кодов, которые я упоминал первоначально. – EJF

+0

выберите * от #patients, где pateintid в ( ВЫБОР pateintid ОТ #patients ГДЕ код в ('ABC123', '') DEF456 группы по pateintid , имеющей COUNT (*)> 1). попробуйте это – bmsqldev

+1

@TAY Я отредактировал ответ. Проверьте последнюю строку. – Christian

1

Выберите записи с двумя кодами , но используйте COUNT OVER для подсчета отдельных кодов на пациента. Только держите эти записи со счетом 2 кода для пациента, то есть пациентов с и.

select patient_id, last_name, first_name, code, visit_date 
from 
(
    select mytable.*, count(distinct code) over (partition by patient_id) as cnt 
    from mytable 
    where code in ('ABC123','DEF456') 
) data 
where cnt = 2; 
Смежные вопросы