2009-07-30 34 views
34

साथ एसक्यूएल ग्रुप द्वारा मामला बयान मैं एक स्तंभ है कि कुछ इस तरह दिखता है:समेकित फ़ंक्शन

CASE 
    WHEN col1 > col2 THEN SUM(col3*col4) 
    ELSE 0 
END AS some_product 

और मैं BY खंड मेरे ग्रुप में रख चाहते हैं, लेकिन इस समस्या पैदा कर रहा है, क्योंकि वहाँ लगता है कॉलम में एक समग्र समारोह। क्या इस मामले में some_product जैसे कॉलम उपनाम द्वारा ग्रुप करने का कोई तरीका है, या क्या मुझे इसे एक सबक्वायरी और समूह में रखना होगा?

उत्तर

41

द्वारा समूहीकृत करना चाहते हैं मेरा अनुमान है कि आप वास्तव में नहीं है GROUP BY some_product करना चाहते हैं।

जवाब देने के लिए: "? इस तरह इस मामले में some_product रूप GROUP BY एक स्तंभ उर्फ ​​करने के लिए एक रास्ता है, या मैं एक सबक्वेरी और उस पर समूह में इस डाल करने की आवश्यकता है" है: आप GROUP BY कॉलम उपनाम नहीं कर सकते हैं।

SELECT खंड, जहां कॉलम उपनाम असाइन किए जाते हैं, GROUP BY खंड के बाद तक संसाधित नहीं किया जाता है। ग्रुपिंग के लिए परिणाम उपलब्ध कराने के लिए एक इनलाइन व्यू या सामान्य टेबल एक्सप्रेशन (सीटीई) का उपयोग किया जा सकता है।

इनलाइन दृश्य:

select ... 
from (select ... , CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END AS some_product 
    from ... 
    group by col1, col2 ...) T 
group by some_product ... 

CTE:

with T as (select ... , CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END AS some_product 
    from ... 
    group by col1, col2 ...) 
select ... 
from T 
group by some_product ... 
+1

को सही करने के लिए संपादित करूंगा यह एक महान उदाहरण है कि सीटीई का उपयोग कैसे करें । –

1

आप तो बजाय तुम्हारे पास क्या है,

लिखने के रूप में

Sum(CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END) as SumSomeProduct 

, तो OTOH, आप आंतरिक अभिव्यक्ति group By करना चाहते हैं, कुछ अन्य मूल्य द्वारा समूहीकरण रहे हैं, तो (col3*col4) तो

group By लिखने/ओ SUM डब्ल्यू अभिव्यक्ति मैच के लिए ...

Select Sum(Case When col1 > col2 Then col3*col4 Else 0 End) as SumSomeProduct 
From ... 

Group By Case When col1 > col2 Then col3*col4 Else 0 End 

अंत में, यदि आप वास्तविक सकल

Select SumSomeProduct, Count(*), <other aggregate functions> 
From (Select <other columns you are grouping By>, 
     Sum(Case When col1 > col2 
      Then col3*col4 Else 0 End) as SumSomeProduct 
     From Table 
     Group By <Other Columns>) As Z 
Group by SumSomeProduct 
+0

आप * समूह * को समेकित करते हैं। * समूह * पर नहीं। – gbn

+0

जो भी ऊपर उठाया गया, यह गलत है। अपने आप को कुछ ऐसा करने का प्रयास करें ... "मुझे दो मानों का योग गुणा करें, 2 अन्य मानों द्वारा समूहीकृत, और मेरे समूह के कुल समूह पर भी समूह दें"। – gbn

+0

चार्ल्स के संपादन के बाद: आपकी आंतरिक क्वेरी केवल एक पंक्ति लौटाएगी, जिससे आपका बाहरी समूह अर्थहीन हो जाएगा ... – gbn

27

जबकि Shannon's answer तकनीकी रूप से सही है, यह overkill की तरह लग रहा है।

सरल समाधान यह है कि आपको case कथन के बाहर अपना सारांश डालना होगा। इस चाल करना चाहिए:

sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product 

असल में, अपने पुराने कोड को व्यक्तिगत रूप से प्रत्येक पंक्ति के लिए sum(X*Y) निष्पादित करने के लिए (जो समूहीकृत नहीं किया जा सकता है अपने स्वयं के जवाब के साथ प्रत्येक पंक्ति छोड़कर) एसक्यूएल बताता है।

मैंने जो कोड लाइन लिखा है वह योग उत्पाद लेता है, जो आप चाहते हैं।

+0

क्या कोई कारण है कि आप सीएनई से जुड़े शैनन के जवाब पर इस विधि का उपयोग नहीं करना चाहते हैं? धन्यवाद – Gareth

+0

सामान्य मामले के विवरण के लिए, आप शैनन के उत्तर का उपयोग करना चाहते हैं। यह 0 0 के 0 पर निर्भर करता है। – coberlin

संबंधित मुद्दे