কোনও জিজ্ঞাসা থেকে হারিয়ে যাওয়া তারিখগুলি সন্নিবেশ করান


9

আমি তৈরি করা একটি ক্যোয়ারী থেকে কীভাবে আমি অনুপস্থিত তারিখগুলি sertোকাতে পারি। নীচে ফলাফল:

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

দয়া করে মনে রাখবেন যে আমি কেবল সার্ভারে অ্যাক্সেস পড়েছি।


আপনি ফলাফল আনতে কোন প্রশ্ন ব্যবহার করছেন? বা আপনার একটি তারিখের সীমা নির্ধারণ করা আছে? আপনি কি আপনার প্রশ্ন বা সারণী যুক্ত করতে পারেন
বিজয়প

1
একটি ক্যালেন্ডার টেবিল ব্যবহার করুন, এটি থেকে নির্বাচন করুন এবং তারপরে তারিখ অনুসারে
মার্ক সিংকিনসন

আমি প্রধান সারণী থেকে ফলাফল আনতে কোয়েরি ব্যবহার করছি।
আরভিন

আপনি যদি কেবল অ্যাক্সেস পড়ে থাকেন তবে আপনাকে ডাটাবেস orোকানো বা আপডেট করার কথা নয়। পরিবর্তে আপনার ডিবিএ দলটিকে আপনাকে সহায়তা করতে বলুন।
কিন শাহ

1
@ কিনুন আমি মনে করি যে প্রশ্নের অর্থ তারা আসল ডাটাবেস সারণিতে সারি সন্নিবেশ করানোর পরিবর্তে ফলাফল সেটটিতে সারি সন্নিবেশ করতে চান।
মার্ক সিংকিনসন

উত্তর:


12

এখানে একটি ক্যালেন্ডার টেবিল ব্যবহার করে একটি উদাহরণ দেওয়া হয়েছে (যা আপনার সত্যিকারের হওয়া উচিত)। এই উদাহরণটি কেবল ২০১৪-তে জনবহুল হয়েছে তবে আপনি এটি যতটা বছর পছন্দ হিসাবে স্টাফ করতে পারেন ...

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);

এসকিউএলফিডাল উদাহরণ

যদি আপনি কোনও ক্যালেন্ডার সারণি তৈরি করতে না পারেন (এবং কোনও সংখ্যা সারণীও কার্যকর নয়), তবে আপনি কেবল এটিকে ইনলাইন রাখতে পারেন:

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);

এসকিউএলফিডাল উদাহরণ

সেট তৈরির বিষয়ে আরও জানার জন্য (তারিখ, সংখ্যা ইত্যাদি) এই সিরিজটি দেখুন:


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

তারিখের পরিধি আরও বিস্তৃত হওয়ায় পুনরাবৃত্ত সিটিই পদ্ধতির তাত্পর্যপূর্ণভাবে আরও ব্যয়বহুল হয়ে ওঠে। এই উদ্দেশ্যে সেটগুলি অর্জনের আরও কার্যকর উপায় রয়েছে।
অ্যারন বার্ট্র্যান্ড

@ অ্যারনবার্ট্র্যান্ড এখানে পরিসীমাটি বেশ ছোট, তবে বিকল্পগুলির কোনও লিঙ্ক? আমার কৌতূহলের জন্য।
মিহাই

1
হ্যাঁ, এখানে , এটি একটি ছোট পরিসীমা হতে পারে। সমস্যা হ'ল লোকেরা এই পদ্ধতিটি শিখে এবং তারপরে এটি আরও বড় আকারের স্কেলগুলিতে প্রয়োগ করে যেখানে এটি সমস্যা হয়ে ওঠে। এই ক্ষেত্রে এটি "ঠিক আছে" কারণ ধীর পন্থাটি কেন ব্যবহার করবেন? আমার উত্তর দেখুন।
অ্যারন বারট্র্যান্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.