2012-07-27 12 views
5

0 के अंदर चर को प्रारंभ करने के लिए सीटीई का उपयोग करें, मुझे एक दृश्य बनाने की आवश्यकता है - यह पांच यूनियन सभी बयान द्वारा रचित है।टी-एसक्यूएल

उदाहरण के लिए::

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() फ़ंक्शन का भी उपयोग कर रहा हूं और यह किसी भी मिलीसेकंद के अलग-अलग मूल्य को वापस कर देगा।

यही कारण है कि मैं सभी दिनांक स्थिति चर शुरू करने के लिए या सीटीई में एक बार गणना करने के लिए सीटीई अभिव्यक्ति का उपयोग करना चाहता हूं, और उसके बाद चयन-यूनियन खंड में इस दिनांक की स्थिति का उपयोग करना चाहता हूं।

समस्या यह है कि, मैं नीचे दिए गए चयन कथन के साथ सीटीई से जानकारी में शामिल नहीं हो पा रहा हूं और जब मैं सीधे दिनांक शर्तों (बिना शामिल किए) का उपयोग करने का प्रयास करता हूं तो यह काम नहीं कर रहा है ("त्रुटि - अमान्य कॉलम नाम")।

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

आपको प्रत्येक क्वेरी के खंड से सीटीई का उपयोग करना होगा। आप इसे 'क्रॉस लागू' के साथ कर सकते हैं। –

+0

बहुत बहुत धन्यवाद। यह सही काम है। कृपया प्रश्न के रूप में चिह्नित करने के लिए अपना उत्तर पोस्ट करें। – gotqn

उत्तर

6

आप प्रत्येक क्वेरी के खंड से में 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 
संबंधित मुद्दे