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)
您必须在每个查询的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)