2012-07-27 12 views
5

Ho bisogno di creare una vista - è composta da cinque istruzioni UNION ALL. La differenza tra ogni istruzione è che i dati è il filtro per periodo differente:T-SQL Usa CTE per inizializzare le variabili all'interno di una vista

Ad esempio:

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 

Poi sto creando un perno utilizzando la visualizzazione.

In ogni caso, la condizione di "data" viene calcolata in modo più complesso. Sto usando anche la funzione GETUTCDATE() e questo restituirà un valore diverso ogni millisecondo.

Ecco perché voglio utilizzare un'espressione CTE per inizializzare tutte le variabili di condizione data o per eseguire i calcoli una sola volta nel CTE e quindi per utilizzare le condizioni di data nella clausola SELECT-UNION.

Il problema è che non sono in grado di unire le informazioni dal CTE con l'istruzione SELECT in basso e quando provo a utilizzare direttamente le condizioni della data (senza join) non funziona ("Errore - Nome colonna non valido").

Questo è un esempio di quello che sto cercando di fare:

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

È necessario utilizzare il CTE nella clausola from di ogni query. Puoi farlo con un 'cross apply '. –

+0

Grazie mille. Questo è un lavoro perfetto. Si prega di inviare la risposta per contrassegnare la domanda come chiusa. – gotqn

risposta

6

È necessario utilizzare il CTE nella clausola FROM di ogni query. Puoi farlo con un 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