কীভাবে 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 ব্যক্তির সাথে 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 একক টেবিলের ফলাফল হিসাবে। আমি ভিএম_টোল_লিনেন্স সারণী এবং ক্যোয়ারী নীচের মতো ভিএম_টোল_লিকেন্স_একটিভ, ভিএম_টোল_লিকেন্স_একটিভ, ভিএম_টোল_আইডি দিয়ে ভিএম_টোল_লিকেন্স_একটিভ = মিথ্যা
নরেন্দ্র

উত্তর:


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


তবে যদি অ্যাপয়েন্টমেন্টের কিছু ক্ষেত্র শূন্য না হয় (সারণির সংজ্ঞায়)?
লাইয়ার ইয়েজ্কেলি

@ লিয়ারইহিজ্কেলি: "কিছু কিছু কলাম" এতে কিছু যায় আসে না। গণনা () যোগদানের কলামটি ব্যবহার করে। যদি এটি শূন্য না হয়, তবে একটি অ্যাপয়েন্টমেন্ট রয়েছে যা গণনা করা উচিত
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
টেবিলটি কোয়েরিতে অন্তর্ভুক্ত না হওয়ায় মূল প্রশ্নে গ্রুপটি টাইপোর মতো মনে হচ্ছে।
জোছিম ইসাকসন

7

যদি আপনি বাহ্যিক যোগদান করেন (গণনা সহ), এবং তারপরে এই ফলাফলটি উপ-সারণী হিসাবে ব্যবহার করেন, তবে আপনি প্রত্যাশার মতো 0 পেতে পারেন (এনভিএল ফাংশনটির জন্য ধন্যবাদ)

উদা:

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

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

বাম যোগদানের সমস্যাটি হ'ল যদি কোনও অ্যাপয়েন্টমেন্ট না থাকে তবে এটি একটি শূন্যের সাথে আবার একটি সারিতে ফিরে আসবে, এটি যখন COUNT দ্বারা একত্রিত হয় তখন 1 হয়ে যাবে এবং দেখা যাবে যে ব্যক্তিটির একটি অ্যাপয়েন্টমেন্ট রয়েছে যখন তাদের আসলে কিছুই নেই। আমি মনে করি এটি সঠিক ফলাফল দেবে:

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

আমি কেবল এই একই সমাধানটি পোস্ট করতে যাচ্ছিলাম, খুব সাধারণ।
জোয়েল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.