Saya telah membuat SQL Fiddle solusi ini untuk Anda mainkan.
Pada dasarnya itu membuat Tabel Kerja @Bulan dan kemudian Cross bergabung ini akan bertahun-tahun dalam kumpulan data Anda. Ini menghasilkan daftar lengkap semua bulan untuk semua tahun. Saya kemudian pergi bergabung dengan data Uji yang disediakan dalam contoh Anda (Tabel bernama TEST - lihat SQL biola untuk skema) kembali ke daftar ini untuk memberi saya daftar lengkap dengan Nilai untuk bulan-bulan yang memilikinya. Masalah berikutnya yang harus diatasi adalah menggunakan nilai bulan terakhir jika bulan ini tidak ada. Untuk itu, saya menggunakan sub-kueri yang berkorelasi yaitu bergabung kembali dengan tblValues hanya jika cocok dengan Peringkat maksimum dari suatu baris yang memiliki nilai. Ini kemudian memberikan set hasil yang lengkap!
Jika Anda ingin memfilter menurut tahun\bulan, Anda dapat menambahkan ini ke dalam klausa WHERE tepat sebelum Urutan Terakhir Oleh.
Selamat menikmati!
Skema Pengujian
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)
Kueri
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