2010-03-19 14 views
7

क्या कोई आसान तरीका है कि मैं औसत को प्रभावित करने से नल को बाहर कर सकता हूं? वे 0 के रूप में गिनने लगते हैं, जो मैं नहीं चाहता हूं। मैं बस अपना औसत खाता में नहीं लेना चाहता, फिर भी पकड़ है, मैं उन्हें परिणाम सेट से नहीं छोड़ सकता, क्योंकि उस रिकॉर्ड में डेटा है जिसकी मुझे आवश्यकता है।MySQL: औसत के साथ औसत

अद्यतन:

उदाहरण:

select avg(col1+col2), count(col3) from table1 
where 
group by SomeArbitraryCol 
having avg(col1+col2) < 500 and count(col3) > 3 
order by avgcol1+col2) asc; 

यह मेरे लिए काम किया जाएगा, लेकिन के रूप में वे 0 के रूप में शून्य मान गिनती कर रहे हैं, जो वास्तव में बंद फेंक है, औसत सही नहीं हैं पूरे औसत

+0

क्या भाषा? या आप यह सब एसक्यूएल में कर रहे हैं? –

+0

MySQL – Zombies

+1

के तहत सरल एसक्यूएल मुझे यह नहीं मिला, क्यों न केवल शून्य मानों के साथ रिकॉर्ड का चयन करें और उन्हें औसत दें? – questzen

उत्तर

13

नहीं है एसक्यूएल में कुल फ़ंक्शन (एसयूएम, एवीजी, COUNT, आदि) हमेशा स्वचालित रूप से NULL को बहिष्कृत करते हैं।

तो एसयूएम (कोल)/COUNT (कोल) = एवीजी (कोल) - यह महान और सुसंगत है।

COUNT (*) का विशेष मामला प्रत्येक पंक्ति की गणना करता है।

यदि आप एनयूएलएल के साथ एक अभिव्यक्ति करते हैं: ए + बी जहां या तो ए या बी न्यूल है, तो ए + बी अन्य कॉलम न्यूल के बावजूद पूर्ण होगा।

जब एनयूएलएल सामान्य रूप से एवीजी (ए + बी) <> एवीजी (ए) + एवीजी (बी) होते हैं, और उनके पास अलग-अलग संप्रदाय भी होंगे। आपको कॉलम लपेटना होगा: AVG (COALESCE (ए, 0) + COALESCE (बी, 0)) को हल करने के लिए, लेकिन शायद उस मामले को भी बाहर निकालें जहां COALESCE (A, 0) + COALESCE (B, 0)।

अपने कोड के आधार पर, मेरा सुझाव है:

select avg(coalesce(col1, 0) + coalesce(col2, 0)), count(col3) from table1 
where coalesce(col1, col2) is not null -- double nulls are eliminated 
group by SomeArbitraryCol 
having avg(coalesce(col1, 0) + coalesce(col2, 0)) < 500 and count(col3) > 3 
order by avg(coalesce(col1, 0) + coalesce(col2, 0)) asc; 
5
AVG(number) 

क्या मैं सोच सकता हूं कि सबसे अच्छा तरीका है। इसमें स्वचालित रूप से नल शामिल नहीं होना चाहिए। Here थोड़ा पढ़ना है।

+0

क्या यह नंबर 1 + संख्या 2 के लिए समान है? क्योंकि मुझे यह नहीं मिल रहा है, मेरे लिए नल 0 के रूप में गिना जाता है, इस प्रकार औसत बहुत अधिक वजन कम होता है। – Zombies

+0

@ ज़ोंबी नहीं, यह मैन्युअल अतिरिक्त अभिव्यक्ति के लिए समान नहीं है जो सामान्य न्यूल नियमों का पालन करता है। –

3
SELECT SUM(field)/COUNT(field) 
FROM table 
WHERE othercondition AND (field IS NOT NULL) 

Link

+0

क्या यह उन कॉलों को छोड़ नहीं देगा जहां क्षेत्र शून्य है? मुझे उस कॉल की जरूरत है, जो कि यह मुश्किल बनाता है। – Zombies

+1

AVG (col) हमेशा SUM (col)/COUNT (col) के बराबर होता है, और NULL स्वचालित रूप से बहिष्कृत होते हैं, इसलिए यह क्वेरी हमेशा अन्य परिणामों के साथ तालिका से SELECT AVG (फ़ील्ड) के समान परिणाम लौटाएगी। –

1

उत्तर मूल प्रश्न के आधार पर:

SELECT AVG(t1.NumCol + t1.NumCol2), COUNT(table.NumCol) 
FROM 
(
SELECT NumCol, NumCol2 
FROM table 
WHERE (cond) AND (NumCol IS NOT NULL) AND (NumCol2 IS NOT NULL) 
) t1, 
table 
WHERE (cond) 

मैं नए प्रतिबंधों के साथ लगता है, यह अभी भी सिद्धांत रूप में काम करता है, लेकिन सबसे कुशल तरीके से

1

वहाँ एक अच्छा मौका है कि आप क्या दूसरों को यहाँ कहा है से सही उत्तर पर प्राप्त करने में सक्षम हो जाएगा है, लेकिन मामले में आप नहीं है:

आपकी तालिका में कौन से मूल्य शून्य हो सकते हैं? और यदि आप उनमें से कोई भी हो तो आप क्या करना चाहते हैं?

आप क्या परिणाम आप देखना चाहते हैं, तो col1 शून्य है, या col2 शून्य है, या अगर वे दोनों, शून्य होने के लिए आदि हो

0

मैं हाल ही में इस चाल का इस्तेमाल किया निर्दिष्ट कभी नहीं:

AVG(
    CASE 
     WHEN 
      valToBeAveraged IS NULL 
     THEN 
      0 
     ELSE 
      valToBeAveraged 
    END 
) 

मुझे विश्वास है कि चेतावनी बस यही है। लेकिन यह मुझे दिमाग की शांति प्रदान करता है क्योंकि मुझे पता है कि यह वास्तव में कैसे काम करता है।

हैप्पी कोडिंग

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