2011-08-16 9 views
5

मैं एक अजीब परिदृश्य है इस प्रकार है, जहां मैं संरचित एक तालिका के दाईं सबसे गैर शून्य स्तंभ वापस जाने के लिए की जरूरत है:T-SQL - लौटें सबसे-दाएं गैर शून्य स्तंभ

GL   Q1   Q2   Q3   Q4 
1   100   0   0   0 
2   100   900   250   0 
3   600   100   0   1000 

मैं उम्मीद कर रहा हूँ उत्पादन होने के लिए:

GL   Amount 
1   100 
2   250 
3   1000 

वहाँ वैसे भी एक मामला बयान या इसी तरह के समाधान का सहारा के बिना एक सेट-आधारित दृष्टिकोण के रूप में यह पूरा करने के है? प्रदर्शन यहां महत्वपूर्ण होगा।

+1

मुझे नहीं लगता कि आप 0 के बजाय उन्हें शून्य के रूप में प्राप्त कर सकते हैं? –

+1

क्या होगा यदि सभी शून्य हैं? – gbn

उत्तर

11
SELECT 
    GL, 
    COALESCE(NULLIF(Q4,0), NULLIF(Q3,0), NULLIF(Q2,0), NULLIF(Q1,0)) as Amount 
FROM 
    myTable 
+0

सही विचार, गलत आदेश। –

+0

@ जेरेमी - धन्यवाद - यह मुझे ध्यान दे रहा है। :-) तय किया गया। – Chains

4

कोई निर्धारित आधारित दृष्टिकोण, के रूप में एसक्यूएल पंक्तियाँ, नहीं कॉलम भर में एकत्र करने के लिए बनाया गया है।

मैं वास्तव में मामला बहुत तेजी से यहां होने की अपेक्षा करेंगे ...

CASE WHEN Q4 <> 0 THEN Q4 
    WHEN Q3 <> 0 THEN Q3 
    WHEN Q2 <> 0 THEN Q2 
    WHEN Q1 <> 0 THEN Q1 
        ELSE NULL 
END 

नहीं है, तथापि, NULLs का उपयोग कर और एक वैकल्पिक सम्मिलित ...

COALESCE(NULLIF(Q4, 0), NULLIF(Q3, 0), NULLIF(Q2, 0), NULLIF(Q1, 0)) 
1

प्रकरण बयान करने के लिए सही है यहां उपयोग करें। यह उपलब्ध सबसे अधिक प्रदर्शन विकल्प है।

SELECT GL, 
    CASE 
    WHEN Q4 != 0 THEN Q4 
    WHEN Q3 != 0 THEN Q3 
    WHEN Q2 != 0 THEN Q2 
    ELSE Q1 
    END 
FROM TheTable 

यदि आपको सेट आधारित दृष्टिकोण की आवश्यकता है - तो आपको PIVOT और फिर RowNumber द्वारा एकत्र करना होगा। वह धीमा है।

+1

... और यदि आप नल का सामना करते हैं? –

+3

शून्य व्यवहार को प्रश्न में परिभाषित नहीं किया गया था ... इसलिए उत्तर में परिभाषित नहीं किया गया है। –

+1

एनयूएलएल अधिकांश आरडीबीएमएस पर डिफ़ॉल्ट कॉलम विनिर्देश है। यदि निर्दिष्ट नहीं है, तो माना जाना चाहिए। –

1
SELECT 
COALESCE(NULLIF(Q4,0),NULLIF(Q3,0),NULLIF(Q2,0),NULLIF(Q1,0)) 
1

सेट-आधारित है "क्यू?" के अल्फा सॉर्टिंग पर आधारित (मान लें कि सभी क्वार्टर 0 नहीं हैं 0)

with T as ( 
select GL, Q, VALUE, row_number() over (partition by GL order by Q desc) as row 
    from (
     select GL,Q1,Q2,Q3,Q4 from theTable 
    ) T 
    unpivot (VALUE for Q in (Q1,Q2,Q3,Q4)) as U 
    where VALUE <> 0 
) 
select * from T 
    where row = 1 
संबंधित मुद्दे