मैंने एक SQL Fiddle बनाया है आपके साथ खेलने के लिए इस समाधान का।
अनिवार्य रूप से यह एक कार्य तालिका @Months बनाता है और फिर क्रॉस आपके डेटा सेट में सभी वर्षों में शामिल हो जाता है। यह सभी वर्षों के लिए सभी महीनों की पूरी सूची तैयार करता है। फिर मैंने आपके उदाहरण में प्रदान किए गए टेस्ट डेटा में शामिल होना छोड़ दिया (टेस्ट नाम की तालिका - स्कीमा के लिए एसक्यूएल फिडल देखें) इस सूची में वापस मुझे उन महीनों के मूल्यों के साथ एक पूरी सूची देने के लिए। अगला मुद्दा पिछले महीनों के मूल्यों का उपयोग कर रहा था यदि इस महीने में कोई मूल्य नहीं था। उसके लिए, मैंने एक सहसंबद्ध उप-क्वेरी का उपयोग किया यानी tblValues में केवल तभी शामिल हो गया जब यह एक पंक्ति के अधिकतम रैंक से मेल खाता हो, जिसका मूल्य हो। यह तब एक संपूर्ण परिणाम सेट देता है!
अगर आप साल/माह के हिसाब से फ़िल्टर करना चाहते हैं, तो आप इसे अंतिम ऑर्डर बाय के ठीक पहले WHERE क्लॉज़ में जोड़ सकते हैं।
आनंद लें!
टेस्ट स्कीमा
CREATE TABLE TEST( Month tinyint, Year int, Value int)
INSERT INTO TEST(Month, Year, Value)
VALUES
(1,2013,100),
(4,2013,101),
(8,2013,102),
(2,2014,103),
(4,2014,104)
क्वेरी
DECLARE @Months Table(Month tinyint)
Insert into @Months(Month)Values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12);
With tblValues as (
select Rank() Over (ORDER BY y.Year, m.Month) as [Rank],
m.Month,
y.Year,
t.Value
from @Months m
CROSS JOIN ( Select Distinct Year from Test ) y
LEFT JOIN Test t on t.Month = m.Month and t.Year = y.Year
)
Select t.Month, t.Year, COALESCE(t.Value, t1.Value) as Value
from tblValues t
left join tblValues t1 on t1.Rank = (
Select Max(tmax.Rank)
From tblValues tmax
Where tmax.Rank < t.Rank AND tmax.Value is not null)
Order by t.Year, t.Month