2012-07-27 8 views
5

Necesito crear una vista: está compuesta por cinco declaraciones UNION ALL. La diferencia entre cada instrucción es que los datos es el filtro por diferente período:T-SQL Use CTE para inicializar variables dentro de una vista

Por ejemplo:

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 

Entonces estoy creando un pivote mediante la vista.

De todos modos, la condición de "fecha" se calcula de una manera más compleja. También estoy usando la función GETUTCDATE() y esto devolverá un valor diferente en milisegundos.

Es por eso que quiero usar una expresión CTE para inicializar todas las variables de condición de fecha o hacer los cálculos solo una vez en el CTE, y luego usar estas condiciones de fecha en la cláusula SELECT-UNION.

El problema es que no puedo unir la información del CTE con la instrucción SELECT a continuación y cuando intento utilizar las condiciones de fecha directamente (sin unirme) no funciona ("Error - Nombre de columna no válido")

Este es un ejemplo de lo que estoy tratando de hacer:

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

Debe usar el CTE en la cláusula from de cada consulta. Puedes hacerlo con un 'cross apply'. –

+0

Muchas gracias. Ese es el trabajo perfecto. Por favor, publique su respuesta para marcar la pregunta como cerrada. – gotqn

Respuesta

6

Tienes que utilizar el CTE en la cláusula from de cada consulta. Puedes hacerlo 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 
Cuestiones relacionadas