我需要创建一个视图-它由五个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
发布于 2012-07-27 09:12:15
您必须在每个查询的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
https://stackoverflow.com/questions/11684279
复制