По сути, вы хотите создать запрос кросс-таблица с наркотиками.Несмотря на то, что существует множество инструментов OLAP, которые могут делать подобные вещи (среди других видов нарезки и нарезки данных), сделать что-то подобное в традиционном SQL нелегко (и, в общем, невозможно обойтись безкакой-то процедурный синтаксис во всех, кроме простейших сценариев).
По сути, у вас есть два варианта, когда вы делаете это с SQL (ну, точнее, у вас есть опция одна , а другая более сложнаяно гибкая опция, которая вытекает из него):
- Используйте серию операторов
CASE
в своем запросе, чтобы получить столбцы, представляющие каждый отдельный препарат.Это требует заблаговременного знания списка значений переменных (то есть лекарств) - Использование процедурного языка SQL, такого как T-SQL, для динамического построения запроса, использующего операторы case, как описановыше, но наряду с получением этого списка значений из самих данных.
Два варианта по сути делают одно и то же, вы просто торгуете простотой и удобством обслуживания для гибкости во втором варианте.
Например, используя опцию 1:
select
p.NAME,
p.GENDER,
(case when d.DISEASE_ID is null then 0 else 1 end) as HAD_DISEASE,
(case when sum(case when dr.DRUG_ID = 1 then 1 else 0 end) > 0 then 1 else 0 end) as TOOK_DRUG_1,
(case when sum(case when dr.DRUG_ID = 2 then 1 else 0 end) > 0 then 1 else 0 end) as TOOK_DRUG_2,
(case when sum(case when dr.DRUG_ID = 3 then 1 else 0 end) > 0 then 1 else 0 end) as TOOK_DRUG_3
from PERSON_T p
left join DISEASE_T d on d.PERSON_ID = p.PERSON_ID and d.DISEASE_ID = @DiseaseId
left join DRUG_T dr on dr.PERSON_ID = p.PERSON_ID and dr.DRUG_START_DATE < d.DISEASE_START_DATE
group by p.PERSON_ID, p.NAME, p.GENDER, d.DISEASE_ID
Как вы можете сказать, это становится немного трудоемким, когда вы выходите за пределы нескольких потенциальных значений.
Другой вариант - построить этот запрос динамически.Я не знаю PostgreSQL и какие, если таковые имеются, процедурные возможности у него есть, но общая процедура будет такой:
- Соберите список потенциальных
DRUG_ID
значений вместе с именами для столбцов - Подготовьте три строковых значения: префикс SQL (все до первого оператора
CASE
, связанного с наркотиками, SQL stuffix (все после последнего оператора CASE
, связанного с наркотиками) и динамическая часть - Создайте динамическую часть, объединив операторы
CASE
на основе ранее полученного списка - Объедините их в один (надеюсь, допустимый) оператор SQL и выполните