5

ビューを作成する必要があります。ビューは5つのUNIONALLステートメントで構成されています。各ステートメントの違いは、データが異なる期間でフィルター処理されることです。

例えば:

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
4

1 に答える 1

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 
于 2012-07-27T09:12:15.147 に答える