Мне нужно показать последнюю дату регистрации на основе значения, полученного в столбце Enrolled. В этой строке ниже WHEN EnrolledDer = 'N', затем LAST_DTE_OF_ATTEND. EnrolledDer не существует, поскольку это производный столбец. Похоже, мне нужно повторить оператор case, чтобы получить EnrolledDer для столбца, чтобы показать LAST_DTE_OF_ATTEND, для которого псевдоним будет LastDateEnrolledDer. Каков синтаксис для вложения этого оператора case и лучший ли это метод?
Если я попытаюсь сослаться на столбец псевдонима в операторе case, появится ошибка «Недопустимый столбец с именем EnrolledDer».
CASE
WHEN EnrolledDer = 'N' then LAST_DTE_OF_ATTEND --'Invalid Column named EnrolledDer'
SQL-сервер 2014
SELECT [Student ID],
[Unique Course Identifier],
[Course Title],
Term,
[Section Number],
Days,
[Start Time],
[End Time],
[Start Date],
[End Date],
Enrolled,
--Case, If C then Y, else N
--TRANSACTION_STS Enrolled
--One character code, lookup list value
--C :Current
--D :Dropped
--H :History
--P :Pre-registered
--R :Reserved
--W :Wait listed
CASE
WHEN Enrolled = 'C' THEN 'Y'
ELSE 'N'
END AS "EnrolledDer", --Enrolled Derived Column
--DropFlag,
LAST_DTE_OF_ATTEND LastDateEnrolled, --Populate last date enrolled if enrolled flag above is N
CASE
WHEN EnrolledDer = 'N' then LAST_DTE_OF_ATTEND --'Invalid Column named EnrolledDer'
ELSE NULL
END AS LastDateEnrolledDer, --LastDateEnrolledDer Derived Column
Building,
Room,
ROW_NUMBER() OVER(PARTITION BY [Student ID],
[Unique Course Identifier]
ORDER BY [Start Time]) as rn
FROM cteAccScheduleFull
Этот связанный пост содержит тестовые данные https://dba.stackexchange.com/questions/308550/convert-7-columns-in-two-rows-to-14-columns-in-one-row/308555#308555
Я получил этот оператор case для работы с вложенным случаем. Я не уверен, что это лучший способ сделать отступ. Я не люблю повторяющийся код. Будет ли другим решением использовать cte или функцию?
--Populate last date enrolled if enrolled flag above is N
-- CASE
-- WHEN EnrolledDer = 'N' then LAST_DTE_OF_ATTEND
--ELSE NULL
-- END AS LastDateEnrolledDer, --LastDateEnrolledDer Derived Column
CASE
WHEN CASE
WHEN Enrolled = 'C' THEN 'Y'
ELSE 'N'
END
= 'N' then LAST_DTE_OF_ATTEND
ELSE NULL
END AS LastDateEnrolledDer, --LastDateEnrolledDer Derived Column
Псевдоним выражения выполняется через cross apply
. Измените свой FROM
на:
FROM
cteAccScheduleFull
cross apply
(select CASE
WHEN Enrolled = 'C' THEN 'Y'
ELSE 'N'
END AS EnrolledDer --Enrolled Derived Column
) as q1
После этого вы сможете использовать q1.EnrolledDer в своем select
любое количество раз. Вы даже можете связать cross apply
блоки, если у вас было больше зависимых выражений.
Отвечает ли это на ваш вопрос? Ссылка на псевдоним для выражения в операторе SELECT