2010-11-02 27 views
5

कृपया इस पर मेरे साथ भालू, यह समझाना काफी मुश्किल है और मुझे यकीन नहीं है कि मैं सही शब्दावली का उपयोग कर रहा हूं या नहीं।एसक्यूएल: सशर्त चयन के भीतर सशर्त चयन

मुझे एक जटिल चयन करने की आवश्यकता है। यह प्रभावी रूप से एक चुनिंदा कथन है जो सशर्त रूप से निर्णय लेता है कि चयन को फ़िल्टर करने के लिए किस क्षेत्र का उपयोग करना है। यदि कोई निश्चित दिनांक फ़ील्ड शून्य नहीं है, तो मुझे यह जांचना होगा कि उस फ़ील्ड में मान एक निश्चित सीमा के भीतर है।

स्यूडोकोड:

If [Date] is not null 
    Get sum (table.value) for rows Date >= dateValue and Date < dateValue 
Else 
    Get sum (table.value) for rows Int >= intValue and Int < intValue 

मेरे वर्तमान प्रयास:

SELECT CASE WHEN a.Date IS NOT NULL THEN 
(SUM(CASE WHEN (a.Date >= cal.Date) THEN ABS(a.Value) ELSE 0 END)) 
ELSE 
(SUM(CASE WHEN (b.Days >= 0) THEN ABS(a.Value) ELSE 0 END) 
END AS 'A' 
अन्यथा यदि उस तारीख फ़ील्ड रिक्त है मैं एक ही मेज पर एक और क्षेत्र, पूर्णांक क्षेत्र, जांच करने की आवश्यकता एक निश्चित सीमा के भीतर है

कोई विचार? पूछें कि आपको अधिक जानकारी चाहिए या नहीं। अग्रिम धन्यवाद।

+0

कृपया मेरा संपादन – gbn

+0

Yup देखें। चीयर्स। मेरे पास मूल रूप से एक कथन था या लेकिन इंटीजर फ़ील्ड को तब भी खींचा जाएगा जब डेट फ़ील्ड में डेटा शामिल था लेकिन बस सीमा के भीतर नहीं आया था। वहाँ एक शून्य जांच जोड़ने के बारे में नहीं सोचा था! आउच! – Damien

उत्तर

4

एक तरीका है 2 अलग-अलग प्रश्नों को एक साथ जोड़ना है, लेकिन केवल एक खंड एक मूल्य उत्पन्न करेगा। यह या बयान से बचाता है।

SELECT SUM(Value) 
FROM MyTable 
WHERE MyTable.Date >= dateValue and Table.Date < dateValue --NULL Date = false always 
UNION ALL 
SELECT SUM(Value) 
FROM MyTable 
WHERE MyTable.Int >= intValue and Table.Int < intValue 
    AND --ignore this clause if date is NOT NULL 
    MyTable.Date IS NULL 

संपादित करें, साथ या:

SELECT SUM(Value) 
FROM MyTable 
WHERE 
    (
     MyTable.Date IS NOT NULL AND 
     MyTable.Date >= dateValue and Table.Date < dateValue 
    ) 
     OR --actually mutually exclusive 
    (
     MyTable.Date IS NULL AND 
     MyTable.Int >= intValue and Table.Int < intValue 
    ) 
+0

यह दो अलग-अलग रकम वापस करेगा, दो संभावित स्थितियों में से एक राशि नहीं। यह कहना मुश्किल है कि मूल पोस्टर किस बारे में पूछ रहा है, लेकिन ऐसा लगता है कि लक्ष्य सिर्फ एक ही मूल्य है। –

+0

@ सैम: यह क्यों होगा? क्लॉज 1 में कोई पंक्ति नहीं है DATE DATE पूर्ण है, इसलिए क्लॉज 2 लागू होता है। और DATE के लिए खंड 2 परीक्षण न्यूल है ... यदि नल क्लॉज 1 पंक्तियां देगा (यदि रेंज फ़िल्टर निश्चित रूप से सत्य हैं)। यदि आप चाहते हैं, तो आप पहले खंड – gbn

+0

पर DATE को शून्य नहीं जोड़ सकते हैं, क्षमा करें, यह समझाना मुश्किल है। मेरे पास प्रभावी रूप से परिणामों की पंक्तियां होती हैं, लेकिन कारणों के लिए यहां आने के लायक नहीं होने के कारण पंक्ति को किसी निश्चित श्रेणी के भीतर या तो एक फ़ील्ड क्षेत्र या एक पूर्णांक फ़ील्ड के रूप में पहचाना जाता है, दोनों नहीं। दिनांक फ़ील्ड प्राथमिकता लेता है लेकिन यदि यह शून्य है तो मैं पूर्णांक फ़ील्ड का उपयोग करता हूं लेकिन एक बार चुने जाने पर मुझे यह वही मान मिलता है कि यह कैसे चुना गया था। ओह। – Damien

1

यह काम करता है और सभी नहीं है कि अब तक स्यूडोकोड से बंद है, जब तक है के रूप में मैं क्या आप सही तरीके से करना चाहता हूँ की व्याख्या कर रहा हूँ।

SELECT SUM(Value) 
FROM T 
WHERE 
     CASE WHEN DateValue IS NOT NULL 
       THEN DateValue BETWEEN FromDate AND ToDate 
       ELSE IntValue BETWEEN FromInt AND ToInt 
       END 
संबंधित मुद्दे