2012-07-27 8 views
5

ビューを作成する必要があります。ビューは5つのUNION ALLステートメントで構成されています。例えばT-SQL CTEを使用してビュー内の変数を初期化する

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で1回だけ計算を実行したり、SELECT-UNION句でこの日付条件を使用するために、CTE式を使用したいのです。

問題はCTEの情報を以下のSELECTステートメントで結合することができず、日付条件を直接(ジョインなしで)使用しようとしたときに機能していない(「エラー - 無効な列名」です) )。

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 
+0

各クエリのfrom句でCTEを使用する必要があります。あなたは 'クロス適用'でそれを行うことができます。 –

+0

ありがとうございます。それは完璧な仕事です。 質問を閉じたと記入するために回答を投稿してください。 – gotqn

答えて

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 
関連する問題