किसी क्वेरी से गुम तिथियाँ डालें


9

मेरे द्वारा बनाई गई क्वेरी से मैं लापता दिनांक कैसे डाल सकता हूं। नीचे परिणाम:

Date          Frequency
2014-05-18    5
2014-05-20    7
2014-05-25    7
2014-05-27    6

मैं चाहता हूं कि परिणाम 0 मान के साथ गायब होने की तारीख नीचे दी गई है:

Date          Frequency
2014-05-18    5
2014-05-19    0
2014-05-20    7
2014-05-21    0
2014-05-22    0
2014-05-23    0
2014-05-24    0
2014-05-25    7
2014-05-26    0
2014-05-27    6

कृपया ध्यान दें कि मैंने केवल सर्वर तक पहुंच को पढ़ा है।


क्या आप परिणाम लाने के लिए किसी भी प्रश्न का उपयोग कर रहे हैं? या क्या आपके पास एक तिथि सीमा निर्धारित है। क्या आप अपनी क्वेरी या तालिका जोड़ सकते हैं
vijayp

1
एक कैलेंडर तालिका का उपयोग करें, कि से चयन कर और तिथि तक अपना आवृत्तियों के लिए शामिल होने के social.technet.microsoft.com/wiki/contents/articles/...
मार्क Sinkinson

मैं मुख्य तालिका से परिणाम लाने के लिए क्वेरी का उपयोग कर रहा हूं।
अरविन

यदि आपने केवल एक्सेस पढ़ा है , तो आप डेटाबेस को सम्मिलित या अपडेट करने के लिए नहीं हैं। इसके बजाय अपनी DBA टीम को आपकी मदद करने के लिए कहें।
परिजन शाह

1
@ मुझे लगता है कि प्रश्न का अर्थ है कि वे वास्तविक डेटाबेस तालिका में पंक्तियों को सम्मिलित करने के बजाय परिणाम सेट में पंक्तियाँ सम्मिलित करना चाहते हैं।
मार्क सिनकिन्सन

जवाबों:


12

यहां एक कैलेंडर टेबल का उपयोग करके एक उदाहरण दिया गया है (जो आपको वास्तव में होना चाहिए)। यह उदाहरण सिर्फ 2014 को आबाद करता है, लेकिन आप इसे कई सालों तक पसंद कर सकते हैं ...

CREATE TABLE dbo.Calendar(d DATE PRIMARY KEY);

INSERT dbo.Calendar(d) SELECT TOP (365)
 DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY number)-1, '20140101')
 FROM [master].dbo.spt_values
 WHERE [type] = N'P' ORDER BY number;

अब प्रश्न सरल है:

DECLARE @s DATE = '20140518', @e DATE = '20140527';

SELECT c.d, Frequency = COALESCE(s.Frequency,0)
  FROM dbo.Calendar AS c
  LEFT OUTER JOIN dbo.splunge AS s
  ON c.d = s.[date]
  WHERE c.d >= @s
    AND c.d < DATEADD(DAY, 1, @e);

SQLfiddle उदाहरण

यदि आप एक कैलेंडर तालिका नहीं बना सकते हैं (और एक नंबर टेबल भी नहीं है), तो आप इसे केवल इनलाइन डाल सकते हैं:

DECLARE @s DATE = '20140518', @e DATE = '20140527';

SELECT c.d, Frequency = COALESCE(s.Frequency,0)
  FROM 
(
   SELECT TOP (DATEDIFF(DAY, @s, @e)+1)
 DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY number)-1, @s)
 FROM [master].dbo.spt_values
 WHERE [type] = N'P' ORDER BY number
) AS c(d)
  LEFT OUTER JOIN dbo.splunge2 AS s
  ON c.d = s.[date]
  WHERE c.d >= @s
    AND c.d < DATEADD(DAY, 1, @e);

SQLfiddle उदाहरण

जेनरेटिंग सेट्स (तारीखों, संख्याओं आदि के बारे में) के लिए यह श्रृंखला देखें:


0
DECLARE @t TABLE(Dt Date,Frequency int)
INSERT INTO @t VALUES
('2014-05-18',5),('2014-05-20',7),('2014-05-25',7),('2014-05-27',6)



DECLARE @startDate DATE, @endDate DATE
SELECT @startDate = '2014-05-18', @endDate = '2014-05-27' --yyyy-mm-dd
;WITH Calender AS (
    SELECT @startDate AS CalanderDate
    UNION ALL
    SELECT DATEADD(day,1,CalanderDate) FROM Calender
    WHERE DATEADD(day,1,CalanderDate) <= @endDate
)
INSERT INTO @t SELECT
    Dt = CalanderDate,Frequency = 0

FROM Calender c
LEFT JOIN @t t 
ON t.Dt = c.CalanderDate
WHERE t.dt IS NULL
option (maxrecursion 0)

SELECT * FROM @t ORDER BY dt

बेला

2014-05-18  5
2014-05-19  0
2014-05-20  7
2014-05-21  0
2014-05-22  0
2014-05-23  0
2014-05-24  0
2014-05-25  7
2014-05-26  0
2014-05-27  6

पुनरावर्ती CTE दृष्टिकोण बहुत अधिक महंगा हो जाता है क्योंकि तिथि सीमा व्यापक हो जाती है। इस उद्देश्य के लिए सेट प्राप्त करने के अधिक कुशल तरीके हैं।
हारून बर्ट्रेंड

@AaronBertrand यहाँ रेंज बहुत छोटी है, लेकिन विकल्प के लिए कोई भी लिंक? मेरी जिज्ञासा के लिए।
मिहाई

1
हाँ, यहाँ , यह एक छोटी सी सीमा होती है। समस्या यह है कि लोग इस दृष्टिकोण को सीखते हैं और फिर इसे बहुत बड़े पैमाने पर लागू करते हैं जहां यह एक समस्या बन जाती है। धीमे दृष्टिकोण का उपयोग क्यों करें क्योंकि यह इस मामले में "ठीक" है? मेरा जवाब देखिए।
हारून बर्ट्रेंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.