You probably have separate tables for Accounts and Periods but working with the current informataion they will have to be derived.Try something like:-- *** Test Data ***CREATE TABLE #t( Account varchar(20) NOT NULL ,Organization varchar(20) NOT NULL ,Period char(2) NOT NULL ,[Year] char(4) NOT NULL ,Amount money NOT NULL);INSERT INTO #tVALUES('CMP1000', 'PM1', '11', '2011', 100) ,('CMP1001', 'PM1', '11', '2011', 101) ,('CMP1002', 'PM1', '11', '2011', 102) ,('CMP1003', 'PM1', '11', '2011', 103) ,('CMP1001', 'PM1', '12', '2011', 111) ,('CMP1002', 'PM1', '12', '2011', 112) ,('CMP1003', 'PM1', '12', '2011', 113) ,('CMP1002', 'PM1', '01', '2012', 112) ,('CMP1003', 'PM1', '01', '2012', 113);-- *** End Test Data ***WITH AccountsAS( SELECT DISTINCT Account, Organization FROM #t), PeriodsAS( SELECT DISTINCT [Year], Period FROM #t)SELECT A.Account, A.Organization, P.Period, P.[Year] ,COALESCE(T.Amount, L.Amount, CAST(0 AS money)) AS AmountFROM Accounts A CROSS JOIN Periods P LEFT JOIN #t T ON A.Account = T.Account AND A.Organization = T.Organization AND P.[Year] = T.[Year] AND P.Period = T.Period OUTER APPLY ( SELECT TOP (1) T1.Amount FROM #t T1 WHERE T1.Account = A.Account AND T1.Organization = A.Organization AND ( T1.[Year] < P.[Year] OR ( T1.[Year] = P.[Year] AND T1.Period < P.Period ) ) ORDER BY T1.[Year] DESC, T1.Period DESC ) AS LORDER BY [Year], Period, Organization, Account;