2011-10-25 7 views
10

मैं वर्तमान में एक असाइनमेंट पर काम कर रहा हूं जिसके लिए मुझे प्रत्येक मॉड्यूल के लिए संसाधनों की संख्या पर औसत खोजने की आवश्यकता है। वर्तमान तालिका इस प्रकार है:एक ही प्रश्न में एक गिनती() पर औसत

ResourceID ModulID 
    1   1 
    2   7 
    3   2 
    4   4 
    5   1 
    6   1 

तो मूल रूप से, मैं यह पता लगाने की कैसे संसाधनों की औसत संख्या प्राप्त करने के लिए कोशिश कर रहा हूँ। केवल प्रासंगिक परीक्षण डेटा मॉड्यूल 1 के लिए है, जिसमें 3 अलग-अलग संसाधन हैं। लेकिन मुझे सभी परिणामों को प्रदर्शित करने की ज़रूरत है।

यह मेरा कोड है:

select avg(a.ress) GjSnitt, modulID 
from 
(select count(ressursID) as ress 
from ressursertiloppgave 
group by modulID) as a, ressursertiloppgave r 
group by modulID; 

जाहिर है यह काम नहीं कर रहा है, लेकिन मैं क्या इस बिंदु पर बदलने के लिए पर नुकसान में वर्तमान में कर रहा हूँ। मैं वास्तव में आपके पास किसी भी इनपुट की सराहना करता हूं।

+0

आप न केवल अपने बाहरी क्वेरी ('औसत (उपयोग कर सकते हैं) मॉड्यूल आईडी द्वारा समूहित) आंतरिक क्वेरी के बिना? मुझे लगता है कि अपेक्षित परिणाम उत्पन्न करेंगे। –

+0

AVG() के साथ समस्या यह है कि यह मान एक साथ रखता है, और औसत को एकल मान पर ले जाता है। उदाहरण के तौर पर, संसाधन 1,5 और 6 बनाता है 12. जो तब औसत योग लेने के लिए उपयोग करता है। मुझे 1.5 होने की आवश्यकता है, क्योंकि मॉड्यूलिड से जुड़े 3 संसाधन आईडी हैं। – Coss

उत्तर

21

यह वह प्रश्न है जिसे आप निष्पादित कर रहे हैं, थोड़ा कम उलझन में वाक्यविन्यास में लिखा गया है।

SELECT 
    avg(a.ress) as GjSnitt 
    , modulID 
FROM 
    (SELECT COUNT(ressursID) as ress 
    FROM ressursertiloppgave 
    GROUP BY modulID) as a 
CROSS JOIN ressursertiloppgave r <--- Cross join are very very rare! 
GROUP BY modulID; 

आप, टेबल में शामिल होने (6x6 =) बनाने पार की कुल और यह 4 करने के लिए नीचे संघनक में 36 पंक्तियों रहे हैं, लेकिन क्योंकि कुल संख्या 36 है, परिणाम गलत है।
यही कारण है कि आपको कभी भी अंतर्निहित जॉइन का उपयोग नहीं करना चाहिए।

करने के लिए क्वेरी पुनर्लेखन:

SELECT AVG(a.rcount) FROM 
    (select count(*) as rcount 
    FROM ressursertiloppgave r 
    GROUP BY r.ModulID) a 

आप अलग-अलग rowcount और तल पर औसत चाहते हैं कार्य करें:

SELECT r1.ModulID, count(*) as rcount 
FROM ressursertiloppgave r1 
GROUP BY r1.ModulID 
UNION ALL 
    SELECT 'avg = ', AVG(a.rcount) FROM 
    (select count(*) as rcount 
    FROM ressursertiloppgave r2 
    GROUP BY r2.ModulID) a 
+0

मुझे पहले मॉड्यूलिड के लिए मान मिलता है, जो सही परिणाम प्रदर्शित करता है। लेकिन मैं बाकी मॉड्यूलिड्स का पालन कैसे करूं? जब मैं पहले चयन में मॉड्यूलिड शामिल करता हूं, और मॉड्यूलिड द्वारा एक समूह करता है, तो मुझे प्रत्येक मॉड्यूलिड द्वारा प्रदर्शित एक ही परिणाम मिलता है। – Coss

+0

@Coss, अद्यतन प्रश्न देखें। – Johan

+0

आह, मैं देखता हूँ! लेकिन मुझे लगता है कि मैं अपने प्रश्न के साथ बेकार हूँ। जो भी मैं खोज रहा हूं वह हर पंक्ति गणना पर औसत है, यदि यह संभव है। – Coss

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