with basedata ( name, addy, ph, grade) as (select name, addy, ph, grade1from sourcetableunion allselect name, addy, ph, grade2from sourcetableunion allselect name, addy, ph, grade3from sourcetableunion allselect name, addy, ph, grade4from sourcetableunion allselect name, addy, ph, grade5from sourcetable)select name, addy, ph, gradefrom BaseDatawhere grade is not null;
IF OBJECT_ID('tempdb..#test','u') IS NOT NULL DROP TABLE #test;SELECT 'Dan' AS [name], '123 Main' AS addy, '555-5555' AS ph, CAST('A' AS VARCHAR(20)) AS grade1, CAST(NULL AS VARCHAR(20)) AS grade2, CAST('C+' AS VARCHAR(20)) AS grade3, CAST(NULL AS VARCHAR(20)) AS grade4, CAST(NULL AS VARCHAR(20)) AS grade5 INTO #test;SELECT [name],addy,ph,grade FROM ( SELECT [name], addy, ph, grade1, grade2, grade3, grade4, grade5 FROM #test) t UNPIVOT ( grade FOR x IN ([grade1],[grade2],[grade3],[grade4],[grade5]) ) AS unpvtWHERE grade IS NOT NULL
with basedata ( name, addy, ph, subject, grade) as (select name, addy, ph, 'Subject 1', grade1from sourcetableunion allselect name, addy, ph, 'Subject 2', grade2from sourcetableunion all...