2012-07-27 24 views
5

Tôi cần tạo một khung nhìn - nó được tạo thành bởi năm câu lệnh UNION ALL. Sự khác biệt giữa mỗi câu lệnh là dữ liệu được lọc theo thời gian khác nhau:T-SQL Sử dụng CTE để khởi tạo các biến bên trong một khung nhìn

Ví dụ:

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 

Sau đó, tôi đang tạo ra một trục sử dụng giao diện.

Dù sao, điều kiện "ngày" được tính theo cách phức tạp hơn. Tôi đang sử dụng hàm GETUTCDATE() và điều này sẽ trả về giá trị khác nhau bất kỳ mili giây nào. Đó là lý do tại sao tôi muốn sử dụng một biểu thức CTE để khởi tạo tất cả các biến điều kiện ngày hoặc để thực hiện các phép tính một lần duy nhất trong CTE, và sau đó sử dụng điều kiện ngày này trong mệnh đề SELECT-UNION.

Vấn đề là, tôi không thể tham gia thông tin từ CTE với câu lệnh SELECT bên dưới và khi tôi cố gắng sử dụng điều kiện ngày trực tiếp (không tham gia) nó không hoạt động ("Lỗi - Tên cột không hợp lệ").

Đây là một ví dụ về những gì tôi đang cố gắng để làm:

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

Bạn phải sử dụng CTE trong mệnh đề từ của mỗi truy vấn. Bạn có thể làm điều đó với một 'áp dụng chéo'. –

+0

Cảm ơn bạn rất nhiều. Đó là công việc hoàn hảo. Vui lòng đăng câu trả lời của bạn để đánh dấu câu hỏi là đã đóng. – gotqn

Trả lời

6

Bạn phải sử dụng CTE trong từ khoản của mỗi truy vấn. Bạn có thể làm điều đó với một số 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 
Các vấn đề liên quan