2013-02-09 17 views
67

मुझे कुछ एसक्यूएल के साथ थोड़ा सा अटक गया है। मुझे नहीं लगता कि मैं सवाल को शानदार ढंग से वाक्यांश दे सकता हूं - इसलिए मुझे आपको दिखाएं।COUNT कुल में "शून्य"/"0" परिणाम कैसे शामिल करें?

मेरे पास दो टेबल हैं, जिन्हें एक व्यक्ति कहा जाता है, जिसे नियुक्ति कहा जाता है। मैं एक व्यक्ति के पास नियुक्तियों की संख्या वापस करने की कोशिश कर रहा हूं (जिसमें उनके पास शून्य है)। नियुक्ति में person_id है और प्रति नियुक्ति person_id है। तो COUNT(person_id) एक समझदार दृष्टिकोण है।

क्वेरी:

SELECT person_id, COUNT(person_id) AS "number_of_appointments" 
FROM appointment 
GROUP BY person_id; 

सही ढंग से वापसी करेंगे, अपॉइंटमेंट्स एक person_id की संख्या। हालांकि, एक व्यक्ति जिसके पास 0 नियुक्तियां नहीं लौटाई गई हैं (जाहिर है क्योंकि वे उस तालिका में नहीं हैं)।

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments" 
FROM appointment 
JOIN person ON person.person_id = appointment.person_id 
GROUP BY person.person_id; 

यह हालांकि, अभी भी केवल एक person_id एक नियुक्ति है और नहीं है जो व्यक्तियों के साथ एक वापसी है कि मैं क्या चाहता हूँ, जो वापस आ जाएगी:

बयान व्यक्ति मेज से person_id लेने के लिए ट्वीक मेरे जैसे कुछ देता है 0 नियुक्तियां कौन हैं!

कोई सुझाव कृपया?

उत्तर

58

के बजाय का उपयोग करना चाहिए आप एक बाहरी इस के लिए शामिल होने के लिए चाहते हैं (और आप "ड्राइविंग" तालिका के रूप में व्यक्ति उपयोग करने की आवश्यकता)

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments" 
FROM person 
    LEFT JOIN appointment ON person.person_id = appointment.person_id 
GROUP BY person.person_id; 

कारण है कि इस काम कर रहा है, यह है कि बाहरी (बाएं) शामिल होने से उन लोगों के लिए NULL वापस आ जाएगा जिनके पास नियुक्ति नहीं है। कुल कार्य count()NULL मानों की गणना नहीं करेगा और इस प्रकार आपको शून्य मिलेगा।

आप अधिक जानने के लिए बाहरी के बारे में मिलती चाहते हैं, यहाँ एक अच्छा ट्यूटोरियल है: http://sqlzoo.net/wiki/Using_Null

17

आप LEFT JOININNER JOIN

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments" 
FROM person 
LEFT JOIN appointment ON person.person_id = appointment.person_id 
GROUP BY person.person_id; 
+0

ग्रुप BY मूल प्रश्न में एक टाइपो जैसा प्रतीत होता है क्योंकि तालिका क्वेरी में शामिल नहीं है। –

+0

@ जोचिम इक्सक्सन मेरी गलती। बेशक :) –

4

आप बाहरी (गिनती के साथ) में शामिल होने अगर करते हैं, और फिर एक उप-तालिका के रूप में इस परिणाम का उपयोग करें, आप कर सकते हैं 0 पाने की उम्मीद के रूप में (NVL समारोह के लिए धन्यवाद)

पूर्व:

select P.person_id, nvl(A.nb_apptmts, 0) from 
(SELECT person.person_id 
FROM person) P 
LEFT JOIN 
(select person_id, count(*) as nb_apptmts 
from appointment 
group by person_id) A 
ON P.person_id = A.person_id 
1

उपयोग ग्रुप द्वारा का उपयोग कर परिणाम में 0 गणना प्राप्त करने में शामिल हो।

बस 'शामिल' करता है एमएस एसक्यूएल में आंतरिक शामिल होता है, तो बाएं या दाएं जुड़ें के लिए जाएं।

यदि प्राथमिक कुंजी वाली तालिका में QUERY में पहले उल्लेख किया गया है तो बाएं शामिल हों और राइट शामिल हों।

ईजी:

select WARDNO,count(WARDCODE) from MAIPADH 
right join MSWARDH on MSWARDH.WARDNO= MAIPADH.WARDCODE 
group by WARDNO 

select WARDNO,count(WARDCODE) from MSWARDH 
left join MAIPADH on MSWARDH.WARDNO= MAIPADH.WARDCODE group by WARDNO 

उस तालिका से समूह को लें जिसमें प्राथमिक कुंजी है और दूसरी प्रविष्टि से गिनती है जिसमें वास्तविक प्रविष्टियां/विवरण हैं।

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