Я использую SQL Server 2016.
Я работаю над назначением «Y» или «N» столбцу GLP
со следующим условием:
StudyId
есть GLP = FDA
, но есть и GLP = not applicable
, но большинство из них не попадает в эту категорию. В этом случае это все равно будет «Y», так как у него есть «GLP - FDA».У меня есть этот код, который успешно получает типы GLP
и назначает «Y» или «N» для каждого исследования:
SELECT DISTINCT
StudyId,
GLP = CASE
WHEN GLP IN ('non-GLP', 'Not Applicable')
OR GLP IS NULL
THEN 'N'
ELSE 'Y'
END
FROM
AgenciesTable
Этот код возвращает:
Идентификатор исследования | GLP |
---|---|
123456 | Д |
123456 | Н |
456789 | Н |
123456 | Д |
Я хочу:
Идентификатор исследования | GLP |
---|---|
123456 | Д |
456789 | Н |
Но я не знаю, что бы я сделал, чтобы получить только одно «Y» или одно «N» на StudyId
с условиями, которые я указал выше. Я попытался сделать подзапрос, который будет выглядеть примерно так:
SELECT
StudyId,
COUNT(GLP) AS TOT = CASE
WHEN TOT >= 2 THEN 'Y'
ELSE 'N'
END
FROM
(SELECT DISTINCT
StudyId,
GLP = CASE
WHEN GLP IN ('non-GLP', 'Not Applicable')
OR GLP IS NULL
THEN 'N'
ELSE 'Y'
END
FROM AgenciesTable AT)
Не повезло с вышеизложенным, но я чувствую, что иду в правильном направлении. Не знаю, что делать, чтобы продвинуть это. Я мог бы упустить что-то простое или слишком много думать об этом, но я не могу понять это.
Любая помощь, разъяснения или общие идеи приветствуются. Спасибо!
Почему бы не использовать условную агрегацию?
Пример
SELECT StudyId
,GLP = max( CASE WHEN GLP IN ('non-GLP', 'Not Applicable') OR GLP IS NULL THEN 'N' ELSE 'Y' END)
FROM AgenciesTable
Group By StudyId
Полученные результаты
StudyId GLP
123456 Y
456789 N
@Krasnips Всегда рад помочь
Это сработало. Я даже не думал использовать это, хотя, как ни странно, я делаю
MAX(CASE DT.Detail WHEN 'Notes' THEN DT.Comments END) Notes
в другой части моего запроса. Спасибо вам за помощь!