2012-07-27 12 views
5

Potrzebuję utworzyć widok - składa się on z pięciu instrukcji UNION ALL. Różnica między każdym stwierdzeniem jest to, że dane są przez filtr innym okresie:T-SQL Użyj CTE do zainicjowania zmiennych w widoku

Na przykład:

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 

Następnie tworzę sworzeń użyciu widoku.

W każdym razie warunek "data" jest obliczany w bardziej złożony sposób. Używam również funkcji GETUTCDATE(), która zwróci inną wartość o milisekundę.

Dlatego chcę użyć wyrażenia CTE, aby zainicjować wszystkie zmienne warunków daty lub wykonać obliczenia tylko raz w CTE, a następnie użyć tych warunków daty w klauzuli SELECT-UNION.

Problem polega na tym, że nie jestem w stanie dołączyć do informacji z CTE za pomocą poniższej instrukcji SELECT, a kiedy spróbuję użyć warunków daty bezpośrednio (bez łączenia), to nie działa ("Błąd - Niepoprawna nazwa kolumny").

Jest to przykład tego, co próbuję zrobić:

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

Musisz użyć CTE w klauzuli from każdego zapytania. Możesz to zrobić za pomocą opcji "Zastosuj krzyż". –

+0

Dziękuję bardzo. To jest perfekcyjna praca. Proszę napisać odpowiedź, aby oznaczyć pytanie jako zamknięte. – gotqn

Odpowiedz

6

Musisz użyć CTE w klauzuli FROM każdego zapytania. Możesz to zrobić za pomocą 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 
Powiązane problemy