Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

CTE का उपयोग करके SQL सर्वर क्वेरी आउटपुट के लिए अनुपलब्ध तिथियां भरें

पिछले हफ्ते मेरे एक सहयोगी ने मुझसे अनुरोध किया कि मैं क्वेरी आउटपुट में छूटी हुई तारीखों को भरने के लिए एक प्रश्न लिखने में मदद करूं। मुझे कुछ समाधान मिले, न तो मुझे सुविधाजनक लगा। इसलिए, मैंने रिकर्सिव सीटीई या कॉमन टेबल एक्सप्रेशन का उपयोग करके अपना खुद का संकलन किया।

समस्या का विवरण

मान लीजिए कि हमारे पास एक टेबल है जिसमें 1 से 10 जून, 2021 तक कस्टमर केयर के इनकमिंग कॉल रिकॉर्ड हैं। कुछ दिनों में, कोई कॉल रिकॉर्ड नहीं होता है। अगर हम डेटाटाइम कॉलम पर ग्रुप बाय स्टेटमेंट चलाते हैं, तो कुछ दिन गायब रहेंगे। वांछित आउटपुट है, लापता तिथियां 0 मान होंगी। नमूना आउटपुट नीचे होगा:

प्रश्न

SELECT CONVERT(varchar(10),B.call_time,111) AS OriginalDate, COUNT(*) as total
FROM Test1 B
GROUP BY CONVERT(varchar(10),B.call_time,111)
ORDER BY CONVERT(varchar(10),B.call_time,111)

नमूना आउटपुट

वांछित आउटपुट

समाधान के लिए मेरा दृष्टिकोण

साधारण GROUP BY क्वेरी का उपयोग करने के बजाय, CTE और SUB QUERY का उपयोग किया जाता है। दिनांक सीमा उत्पन्न करने के लिए पुनरावर्ती CTE का उपयोग किया जाता है और LEFT OUTER JOIN का उपयोग मान को दिनांक के साथ संयोजित करने के लिए किया जाता है। आइए चरण-दर-चरण बताते हैं।

CTE/सामान्य तालिका अभिव्यक्ति

सीटीई या कॉमन टेबल एक्सप्रेशन एक अस्थायी नामित परिणाम सेट को निर्दिष्ट करता है जो एक साधारण क्वेरी से प्राप्त होता है और एक एकल चयन/इन्सर्ट/अपडेट/डिलीट/मर्ज/क्रिएट व्यू स्टेटमेंट के निष्पादन दायरे में परिभाषित होता है। यह स्वयं को भी संदर्भित कर सकता है जिसे पुनरावर्ती सीटीई कहा जाता है।

डेटा तैयार करना

-- Create the table
CREATE TABLE Test1(
call_time datetime,
name    varchar(10) default ('Mehedi')
)
GO
-- Populate with sample data
INSERT INTO Test1 (call_time, name)
VALUES ('2021-06-01 08:00','A')
,('2021-06-01 09:05','C')
,('2021-06-01 12:50','E')
,('2021-06-01 16:17','D')
,('2021-06-01 18:53','G')
,('2021-06-03 11:07','F')
,('2021-06-03 13:09','A')
,('2021-06-03 16:26','E')
,('2021-06-03 19:56','C')
,('2021-06-03 21:24','A')
,('2021-06-04 19:13','A')
,('2021-06-04 11:45','B')
,('2021-06-04 15:02','C')
,('2021-06-08 23:02','A')
,('2021-06-09 03:04','E')

क्वेरी बनाएं

सबसे पहले, हम एक सीटीई लिखेंगे जो दिनांक सीमा के भीतर सभी तिथियां उत्पन्न करेगा।

DECLARE @StartDate DATE, @EndDate DATE
SET @StartDate = '2021-11-01'
SET @EndDate = '2021-11-08'
;WITH cte AS
(    SELECT @StartDate AS sDate
UNION ALL
SELECT DATEADD(DAY,1,sDate)
FROM cte
WHERE sDate < @EndDate
)
SELECT  sDate
FROM cte;

अब इस सीटीई को LEFT OUTER JOIN के साथ एक उप क्वेरी बनाने के लिए दोबारा क्रियान्वित किया जाएगा ताकि जिस तारीख का मान नहीं है वह दिखाई दे और उसमें 0 मान हो।

DECLARE @startdate DATETIME = '2021-06-01'
DECLARE @endDate DATETIME = '2021-06-10'
;WITH cte
AS
(
SELECT @startdate as sDate
UNION All
SELECT DATEADD(day,1,sDate) From cte where DATEADD(day,1,sDate) <= @endDate
)
SELECT
C.OriginalDate
,C.total
FROM
(
SELECT CONVERT(varchar(10),A.sDate,111) AS OriginalDate, COUNT(B.call_time) as total
FROM cte A
LEFT OUTER JOIN Test1 B
ON A.sDate = CONVERT(varchar(10),B.call_time,111)
GROUP by CONVERT(varchar(10),A.sDate,111)
) C
ORDER BY C.OriginalDate

अंतिम आउटपुट

निष्कर्ष

आशा है, यह आपके लिए मददगार साबित होगा। हैप्पी टीएसक्यूएलिंग!

यह मेरे निजी ब्लॉग में भी उपलब्ध है!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में किसी तालिका में इष्टतम अद्वितीय पहचानकर्ता कैसे खोजें:sp_special_columns

  2. SQL सर्वर (T-SQL) में वर्तमान लॉगिन नाम लौटाएँ

  3. SQL सर्वर डेटाबेस (T-SQL) में लॉग फ़ाइल कैसे जोड़ें

  4. SQL सर्वर में ताले का उपयोग करके लेनदेन संगामिति प्रबंधित करें

  5. क्रिस्टल रिपोर्ट बनाम माइक्रोसॉफ्ट एसक्यूएल सर्वर रिपोर्टिंग सेवाएं