【发布时间】:2012-07-25 22:10:31
【问题描述】:
我需要创建一个视图 - 它由五个 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
然后我正在使用视图创建一个枢轴。
无论如何,“日期”条件是以更复杂的方式计算的。我也在使用 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
【问题讨论】:
-
您必须在每个查询的 from 子句中使用 CTE。您可以使用
cross apply来完成。 -
非常感谢。这是完美的工作。请发布您的答案,以便将问题标记为已关闭。
标签: tsql variables view common-table-expression declare