#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. Хороший ответ содержит объяснение в дополнение к (надеюсь) рабочему коду.