【问题标题】:T-SQL Use CTE to initialize variables inside a viewT-SQL 使用 CTE 初始化视图内的变量
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2021-05-17
    • 2012-01-05
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多