SQL · CODINGNEED
SQL LEFT JOIN के साथ COUNT(*) गलत गिनती क्यों दिखा सकता है?
बिना ऑर्डर वाले ग्राहक को रिपोर्ट में रखें और उसकी गिनती सही तरीके से शून्य दिखाएं।
Read in English →एक पंक्ति का मतलब तय करें
ग्राहक की रिपोर्ट में हर ग्राहक के लिए एक पंक्ति चाहिए। LEFT JOIN उस ग्राहक को भी रखता है जिसका कोई ऑर्डर नहीं है। ऐसे ग्राहक के लिए जुड़ी हुई पंक्ति में order की columns NULL होती हैं। इसी वजह से COUNT(*) उस ग्राहक के लिए एक पंक्ति गिन सकता है, जबकि उसका वास्तविक ऑर्डर शून्य है।
ऑर्डर की पहचान वाली column गिनें
COUNT(o.id) केवल non-NULL order id गिनता है। जब id एक non-NULL primary key है, तब यह वास्तविक ऑर्डर की संख्या देता है। SUM का परिणाम NULL आने पर COALESCE उसे शून्य बनाता है।
SELECT c.id, c.name, COUNT(o.id), COALESCE(SUM(o.amount), 0) FROM customers c LEFT JOIN orders o ON o.customer_id = c.id GROUP BY c.id, c.name ORDER BY c.id;
WHERE से ग्राहक गायब हो सकता है
जोड़ने के बाद WHERE o.amount > 0 लगाने पर बिना ऑर्डर वाले ग्राहक की NULL पंक्ति हट जाती है। पहले तय करें कि रिपोर्ट में सभी ऑर्डर चाहिए या केवल सकारात्मक रकम वाले। सभी ग्राहकों को रखते हुए केवल चुने हुए ऑर्डर गिनने हैं, तो शर्त JOIN के ON हिस्से में रखना या conditional aggregation इस्तेमाल करना उचित हो सकता है।
छोटे डेटा पर सही परिणाम जाँचें
एक नया ग्राहक, दो ऑर्डर वाला ग्राहक, refund वाला ग्राहक और NULL customer_id वाला ऑर्डर लेकर जाँच करें। फिर order lines जोड़ते समय ध्यान दें: एक ऑर्डर कई पंक्तियों में आ सकता है और रकम बार-बार जुड़ सकती है। पहले हर collection का सार बनाएं। SQL lab में असली SQLite query चलती है। छोटी table पर सही परिणाम आने से बड़े production database की गति साबित नहीं होती; वहाँ query plan और वास्तविक डेटा पर परीक्षण ज़रूरी है।
आधिकारिक संदर्भ: SQL documentation
अगला विषय
सुधार बताएं: care@codingneed.com