根据计算的另一列计算列值
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
我得到这个案例语句来处理嵌套案例。我不确定缩进的最佳方法是什么。我不喜欢重复代码。另一种解决方案是使用 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
块。
我需要根据“已注册”列中派生的值显示最后注册日期。在 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
我得到这个案例语句来处理嵌套案例。我不确定缩进的最佳方法是什么。我不喜欢重复代码。另一种解决方案是使用 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
块。