T-SQL使用CTE初始化视图中的变量

got*_*tqn 5 t-sql variables view declare common-table-expression

我需要创建一个视图 - 它由五个UNION ALL语句组成.每个语句之间的区别在于数据按不同时段过滤:

例如:

SELECT  RecordName
       ,CASE
        WHEN RecordDate > DATEADD(WEEK,-1,GETUTCDATE()) THEN 'This week'
        END
UNION ALL
SELECT  RecordName
       ,CASE
        WHEN RecordDate > DATEADD(WEEK,-2,GETUTCDATE()) THEN 'Previos week'
        END
SELECT  RecordName
       ,CASE
        WHEN RecordDate > DATEADD(Year,-1,GETUTCDATE()) THEN 'Year ago'
        END
Run Code Online (Sandbox Code Playgroud)

然后我使用视图创建一个数据透视表.

无论如何,"日期"条件以更复杂的方式计算.我也使用GETUTCDATE()函数,这将返回任何毫秒的不同值.

这就是为什么我想使用CTE表达式来初始化所有日期条件变量或仅在CTE中进行一次计算,然后在SELECT-UNION子句中使用这个日期条件.

问题是,我无法使用下面的SELECT语句加入CTE中的信息,当我尝试直接使用日期条件(没有连接)时,它无法正常工作("错误 - 列名无效").

这是我想要做的一个例子:

WITH DatePeriods(ThisWeek,LastWeek,MonthToDate,QuarterToDate,YearToDate) AS
(
    SELECT  DATEADD(WEEK,-1,GETUTCDATE())  AS ThisWeek
           ,...                            AS LastWeek
           ,...                            AS MonthToDate
           ,...                            AS QuarterToDate
           ,DATEADD(YEAR,-1,GETUTCDATE())  AS YearToDate
)

SELECT  RecordName
       ,CASE
        WHEN RecordDate > ThisWeek THEN 'This week'
        END
UNION ALL
SELECT  RecordName
       ,CASE
        WHEN RecordDate > LastWeek THEN 'Previos week'
        END
SELECT  RecordName
       ,CASE
        WHEN RecordDate >YearToDate THEN 'Year ago'
        END
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 6

您必须在每个查询的from子句中使用CTE.你可以用一个cross apply.

WITH DatePeriods(ThisWeek,LastWeek,MonthToDate,QuarterToDate,YearToDate) AS
(
    SELECT  DATEADD(WEEK,-1,GETUTCDATE())  AS ThisWeek
           ,...                            AS LastWeek
           ,...                            AS MonthToDate
           ,...                            AS QuarterToDate
           ,DATEADD(YEAR,-1,GETUTCDATE())  AS YearToDate
)

SELECT  RecordName
       ,CASE
        WHEN RecordDate > ThisWeek THEN 'This week'
        END
FROM YourTable 
  CROSS APPLY DatePeriods 
UNION ALL
SELECT  RecordName
       ,CASE
        WHEN RecordDate > LastWeek THEN 'Previos week'
        END
FROM YourTable 
  CROSS APPLY DatePeriods 
SELECT  RecordName
       ,CASE
        WHEN RecordDate >YearToDate THEN 'Year ago'
        END
FROM YourTable 
  CROSS APPLY DatePeriods 
Run Code Online (Sandbox Code Playgroud)