COUNT सकल में "शून्य" / "0" परिणाम कैसे शामिल करें?


112

मैं बस अपने आप को कुछ एसक्यूएल के साथ थोड़ा अटक गया हूँ। मुझे नहीं लगता कि मैं प्रश्न को शानदार ढंग से लिख सकता हूं - इसलिए मुझे आपको दिखाना चाहिए।

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

पूछताछ:

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

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

व्यक्ति तालिका से person_id लेने के कथन को मोड़ने से मुझे कुछ ऐसा मिलता है:

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;

हालाँकि, यह अभी भी केवल एक व्यक्ति को वापस लौटेगा, जिसकी नियुक्ति है और न कि मैं जो चाहता हूं, वह उन व्यक्तियों के साथ है, जिनके पास 0 नियुक्तियां हैं!

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


1
क्या होगा अगर मैं शून्य प्राप्त करना चाहता हूँ | सिंगल टेबल पर परिणाम के रूप में 0। मेरे पास vm_tool_licenses तालिका है और क्वेरी नीचे की तरह है चुनिए vm_tool_id, count (vm_tool_license_active) vm_tool_license_active द्वारा vm_tool_licenses समूह, vm_tool_idense_active = false`
Narendra

जवाबों:


101

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

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


लेकिन क्या होगा यदि नियुक्ति के कुछ क्षेत्र NULL (तालिका की परिभाषा में) नहीं हैं?
लाइर येजेक्ली

@ LiorYehezkely: "कुछ कॉलम" कोई फर्क नहीं पड़ता। गणना () जॉइन कॉलम का उपयोग करती है। यदि वह अशक्त नहीं है, तो एक नियुक्ति है जिसे गिना जाना चाहिए
a_horse_with_no_name

21

आपको LEFT JOINइसके बजाय उपयोग करना चाहिएINNER 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;

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

7

यदि आप बाहरी जुड़ाव (गिनती के साथ) करते हैं, और फिर इस परिणाम को उप-तालिका के रूप में उपयोग करते हैं, तो आप अपेक्षित के रूप में 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

5

USE, GROUP BY का उपयोग करके परिणाम में 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

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


2

आपकी मूल क्वेरी पर कम भी बदलने के लिए, यदि आप अपने चालू कर सकते हैं एक में शामिल होने के RIGHTशामिल हो

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

यह सिर्फ चयनित उत्तर पर बनाता है, लेकिन जैसा कि बाहरी जुड़ाव RIGHTदिशा में है, केवल एक शब्द को जोड़ने और कम बदलाव की आवश्यकता है। - बस याद रखें कि यह वहाँ है और कभी-कभी प्रश्नों को अधिक पठनीय बना सकता है और कम पुनर्निर्माण की आवश्यकता होती है।


0

एक LEFT JOIN के साथ समस्या यह है कि अगर कोई अपॉइंटमेंट्स नहीं हैं, तो यह अभी भी एक पंक्ति को एक अशक्त के साथ लौटा देगा, जो जब COUNT द्वारा एकत्रित किया जाएगा 1 हो जाएगा, और यह दिखाई देगा कि व्यक्ति की एक नियुक्ति तब होती है जब वास्तव में उनके पास कोई नहीं होता है। मुझे लगता है कि यह सही परिणाम देगा:

SELECT person.person_id,
(SELECT COUNT(*) FROM appointment WHERE person.person_id = appointment.person_id) AS 'Appointments'
FROM person;

मैं बस एक ही समाधान पोस्ट करने जा रहा था, बहुत सरल।
जोएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.