WHERE क्लॉज इतना नहीं, बल्कि ग्रुप बाय। क्वेरी केवल उन पंक्तियों के लिए डेटा लौटाएगी जो मौजूद हैं। इसका मतलब है कि जब आप टाइमस्टैम्प की तारीख के आधार पर समूह बना रहे हैं, तो केवल वे दिन लौटाए जाएंगे जिनके लिए पंक्तियां हैं। SQL सर्वर संदर्भ से नहीं जान सकता है कि आप "रिक्त स्थान भरना" चाहते हैं, और यह नहीं जानता कि किसके साथ।
सामान्य उत्तर एक सीटीई है जो उन सभी दिनों का उत्पादन करता है जिन्हें आप देखना चाहते हैं, इस प्रकार रिक्त स्थान भरते हैं। यह थोड़ा मुश्किल है क्योंकि इसके लिए एक पुनरावर्ती SQL कथन की आवश्यकता होती है, लेकिन यह एक प्रसिद्ध चाल है:
WITH CTE_Dates AS
(
SELECT @START AS cte_date
UNION ALL
SELECT DATEADD(DAY, 1, cte_date)
FROM CTE_Dates
WHERE DATEADD(DAY, 1, cte_date) <= @END
)
SELECT
cte_date as TIME_STAMP,
ISNULL(COUNT(HL_Logs.Time_Stamp), 0) AS counted_leads,
FROM CTE_Dates
LEFT JOIN HL_Logs ON DATEADD(dd, 0, DATEDIFF(dd, 0, Time_Stamp)) = cte_date
WHERE Time_Stamp between @BEGIN and @END and ID_Location = @LOCATION
GROUP BY cte_date
इसे तोड़कर, सीटीई एक संघ का उपयोग करता है जो पिछली तारीख में एक बार में एक दिन को दोबारा जोड़ने के लिए संदर्भित करता है और उस तारीख को तालिका के हिस्से के रूप में याद रखता है। यदि आपने सीटीई का उपयोग करने वाला एक साधारण कथन चलाया है और उसमें से केवल * चुना है, तो आपको प्रारंभ और समाप्ति के बीच की तिथियों की एक सूची दिखाई देगी। फिर, स्टेटमेंट तारीखों की इस सूची को लॉग टाइमस्टैम्प तिथि के आधार पर लॉग टेबल में जोड़ता है, जबकि उन तारीखों को संरक्षित करता है जिनमें लेफ्ट जॉइन का उपयोग करके कोई लॉग एंट्री नहीं होती है ("बाईं ओर से सभी पंक्तियों को लेता है कि क्या उनके पास" पर मेल खाने वाली पंक्तियाँ हैं। राइट" साइड या नहीं)। अंत में, हम तिथि के अनुसार समूह बनाते हैं और इसके बजाय गिनती करते हैं और हमें वह उत्तर मिलना चाहिए जो आप चाहते हैं।