如何将列别名为另一个操作

How to alias column into another operation

我想使用 Alias 列开始日期到另一个操作中来计算

CASE WHEN GETDATE() > detail.PeriodEndDate  THEN  GETDATE() 
                 ELSE detail.PeriodEndDate
        END as StartDate,

          CASE
                 WHEN usrPlan.PackagePlanId = 1  THEN  DATEADD(month, 1,  StartDate)
                 ELSE  DATEADD(YEAR, 1,  StartDate)
        END as EndDate,

使用CROSS APPLYFROM 子句中定义别​​名。然后它在整个查询中可用:

SELECT . . .,
       v.StartDate,
       (CASE WHEN up.PackagePlanId = 1 THEN  DATEADD(month, 1, v.StartDate)
             ELSE  DATEADD(YEAR, 1,  v.StartDate)
        END) as EndDate,
FROM usrPlan up . . .
     detail d . . . 
     CROSS APPLY
     (VALUES (CASE WHEN GETDATE() > d.PeriodEndDate THEN  GETDATE() 
                   ELSE d.PeriodEndDate
              END)
      ) v(StartDate)

请注意,我添加了 table 别名,以便查询更易于编写和阅读。

我个人的偏好是使用 CTE 定义开始日期列,然后在后续查询中使用它 - 这样可以避免代码重复。

所以,类似于:

; with r as (
SELECT                  *
                        , CASE  WHEN GETDATE() > detail.PeriodEndDate  THEN  GETDATE() 
                                ELSE detail.PeriodEndDate
                            END as StartDate
    FROM                [sourceTable]
)
SELECT                  *
                        , CASE  WHEN PackagePlanId = 1  THEN  DATEADD(month, 1,  StartDate)
                                ELSE  DATEADD(YEAR, 1,  StartDate)
                            END as EndDate
    FROM                r