根据计算的另一列计算列值

Calculate column value based on another column that is calculated

我需要根据“已注册”列中派生的值显示最后注册日期。在 WHEN EnrolledDer = 'N' then LAST_DTE_OF_ATTEND 下面的这一行。 EnrolledDer 不存在,因为它是派生列。看起来我必须重复 case 语句来获取列的 EnrolledDer 以显示别名将是 LastDateEnrolledDer 的 LAST_DTE_OF_ATTEND。嵌套该 case 语句的语法是什么?这是最好的方法吗?

如果我尝试在 case 语句中引用别名列,则错误是 Invalid Column named 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

此相关post有测试数据https://dba.stackexchange.com/questions/308550/convert-7-columns-in-two-rows-to-14-columns-in-one-row/308555#308555

我得到这个案例语句来处理嵌套案例。我不确定缩进的最佳方法是什么。我不喜欢重复代码。另一种解决方案是使用 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

然后您就可以在 select 中多次使用 q1.EnrolledDer。如果你有更多的依赖表达式,你甚至可以链接 cross apply 块。