Пересмотр заявления о том, где включать/исключать определенных пациентов

#sql #sql-server #tsql

Вопрос:

2 аналогичные проблемы с SQL Server:

db_members-это таблица уровней участников, классифицируемая по идентификаторам patient_id, provider_id и level_of_care_id.

Цель состоит в том, чтобы вывести пациентов с разных уровней агрегации.

В первом запросе мы хотим извлечь всех пациентов из этих 6 уровней медицинской помощи, но для LOC 100.007 нам нужно исключить пациентов из одного идентификатора поставщика (‘119282’).;

Во втором запросе мы хотим извлечь всех пациентов из этих 6 уровней медицинской помощи, но для LOC 100.007 нам нужно включить только идентификатор поставщика (‘119282’) пациентов;

(Это упрощенная версия запроса)

 select patient_id, provider_id, level_of_care_cd, 
from db_members 
where  level_of_care_cd in ('100.001', '100.004', '100.007', '100.022', '100.034', '100.037')      
group by level_of_care_cd, provider_id
 

Комментарии:

1. Добро пожаловать в Stackoverflow. Пожалуйста, опубликуйте примеры данных и желаемые результаты в текстовом формате, предпочтительно включая инструкции DDL и DML, чтобы мы могли использовать их для быстрого дублирования ваших данных в наших локальных экземплярах, что поможет нам помочь вам.

2. Что-то вроде where level_of_care_cd in ('100.001', '100.004', '100.022', '100.034', '100.037') OR (level_of_care = '100.007' AND provider_id <> '119282') того, что должно вывести тебя на поле. Соответствующим образом скорректируйте свой второй запрос

3. Пробовать снова. Вы отправили один запрос, но в вашем тексте говорится, что есть два запроса. Почему вы группируетесь без агрегатов? И, наконец, такие фразы, как «эти 6 уровней ухода», ничего не значат для большинства людей. Если вы используете аббревиатуру, связанную с бизнесом, определите ее. Чтение мыслей на расстоянии не работает.

4. В исходном вопросе описывались два запроса, но они похожи, за исключением того, что один должен включать выбранных участников, а другой-исключать выбранных участников. Код был упрощен по сравнению с более крупным запросом, в котором требовался оператор группировки; пожалуйста, проигнорируйте этот фрагмент. Код запроса четко показывает 6 уровней заботы; я не думаю, что большинство людей были бы озадачены тем, что имеется в виду.

5. Я думаю, что Джневилл на правильном пути; я проверю результаты.

Ответ №1:

Исключите поставщика с одним местоположением

 where level_of_care_cd in ( <full list> )
    and not (level_of_care_cd = '100.007' and provider_id = '119282')
 

Это эквивалентно до тех пор, пока в игру не вступают нули:

 where level_of_care_cd in ( <full list> )
    and (level_of_care_cd <> '100.007' or provider_id <> '119282')
 

Разрешить одному поставщику с одним LOC

Будьте осторожны с нулями:

 where level_of_care_cd in ( <full list> )
    and not (level_of_care_cd = '100.007' and provider_id <> '119282')

where level_of_care_cd in ( <full list> )
    and (level_of_care_cd <> '100.007' or provider_id = '119282')
 

Эквивалентности являются результатом законов Де Моргана. Используемые формы not , вероятно, будут наиболее естественно читаться в соответствии с тем, как люди думают. Помните, что or это имеет меньший приоритет, чем and поэтому скобки важны.

Ответ №2:

Попробуй это

     select case when level_of_care_cd ='100.007' and
       patient_id not in (Select patient_id from patients where 
      provider_id='119282')
        then patient_id end as patient_id 
      , provider_id, 
       level_of_care_cd, 
       from db_members 
      where  level_of_care_cd in ('100.001', '100.004', '100.022', ' 
     '100.007`,   100.034', '100.037')       
      group by level_of_care_cd, provider_id
 

Комментарии:

1. Хороший ответ содержит объяснение в дополнение к (надеюсь) рабочему коду.