Вычислить значение столбца на основе другого вычисляемого столбца

Мне нужно показать последнюю дату регистрации на основе значения, полученного в столбце 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

Отвечает ли это на ваш вопрос? Ссылка на псевдоним для выражения в операторе SELECT

HABO 16.03.2022 18:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Псевдоним выражения выполняется через 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 блоки, если у вас было больше зависимых выражений.

Другие вопросы по теме