आप सभी दिनों को सूचीबद्ध करने का तरीका ढूंढ रहे हैं, यहां तक कि वे दिन भी जो आपके customer
में प्रदर्शित नहीं हैं टेबल। यह SQL में गर्दन में एक कुख्यात दर्द है। ऐसा इसलिए है क्योंकि अपने शुद्ध रूप में SQL में किसी भी चीज़ के सन्निहित अनुक्रम की अवधारणा का अभाव है ... कार्डिनल नंबर, दिन, जो भी हो।
इसलिए, आपको सन्निहित कार्डिनल संख्याओं, या तिथियों, या कुछ और के स्रोत वाली एक तालिका प्रस्तुत करने की आवश्यकता है, और फिर उस तालिका में अपने मौजूदा डेटा को शामिल करें।
ऐसा करने के कुछ तरीके हैं। एक है खुद को एक calendar
. बनाना वर्तमान दशक या सदी में या जो कुछ भी हर दिन के लिए एक पंक्ति के साथ तालिका, फिर उसमें शामिल हों। (आधुनिक डेटाबेस की क्षमता की तुलना में वह तालिका बहुत बड़ी नहीं होगी।
मान लें कि आपके पास वह टेबल है, और इसमें date
. नाम का एक कॉलम है . तब आप यह करेंगे।
SELECT calendar.date AS created,
ISNULL(a.customer_count, 0) AS customer_count
FROM calendar
LEFT JOIN (
SELECT COUNT(*) AS customer_count,
DATE(created) AS created
FROM customer
GROUP BY DATE(created)
) a ON calendar.date = a.created
WHERE calendar.date BETWEEN start AND finish
ORDER BY calendar.date
एक दो बातों पर ध्यान दें। सबसे पहले, LEFT JOIN
कैलेंडर तालिका से आपके डेटा सेट तक। यदि आप एक साधारण JOIN
. का उपयोग करते हैं आपके डेटा सेट में अनुपलब्ध डेटा कैलेंडर से पंक्तियों को दबा देगा।
दूसरा, ISNULL
ऊपरी स्तर में SELECT
अपने डेटासेट से अनुपलब्ध, शून्य, मानों को शून्य मानों में बदलने के लिए।
अब, आप पूछते हैं, मुझे वह कैलेंडर तालिका कहां मिल सकती है? मेरा आदरपूर्वक सुझाव है कि आप इसे देखें, और यदि आप इसका पता नहीं लगा सकते हैं तो दूसरा प्रश्न पूछें।
मैंने इस पर एक छोटा सा निबंध लिखा है, जिसे आप यहाँ पा सकते हैं।http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/