DDL:
DECLARE @temp TABLE ( Reg_No INT , Student_Name VARCHAR(20) , Subject1 INT , Subject2 INT , Subject3 INT , Subject4 INT , Total INT ) INSERT INTO @temp (Reg_No, Student_Name, Subject1, Subject2, Subject3, Subject4, Total) VALUES (101, 'Kevin', 85, 94, 78, 90, 347), (102, 'Andy ', 75, 88, 91, 78, 332)
Request # 1 - ROW_NUMBER:
SELECT Reg_No = CASE WHEN rn = 1 THEN t.Reg_No END , Student_Name = CASE WHEN rn = 1 THEN t.Student_Name END , t.[Subject] , Total = CASE WHEN rn = 1 THEN t.Total END FROM ( SELECT Reg_No , Student_Name , [Subject] , Total , rn = ROW_NUMBER() OVER (PARTITION BY Reg_No ORDER BY 1/0) FROM @temp UNPIVOT ( [Subject] FOR tt IN (Subject1, Subject2, Subject3, Subject4) ) unpvt ) t
Request No. 2 - EXTERNAL APPLICATIONS:
SELECT t.* FROM @temp OUTER APPLY ( VALUES (Reg_No, Student_Name, Subject1, Total), (NULL, NULL, Subject2, NULL), (NULL, NULL, Subject3, NULL), (NULL, NULL, Subject4, NULL) ) t(Reg_No, Student_Name, [Subject], Total)
Request:

Request Cost

Output:
Reg_No Student_Name Subject Total ----------- -------------------- ----------- ----------- 101 Kevin 85 347 NULL NULL 94 NULL NULL NULL 78 NULL NULL NULL 90 NULL 102 Andy 75 332 NULL NULL 88 NULL NULL NULL 91 NULL NULL NULL 78 NULL
PS: In your case, a request with OUTER APPLY faster than ROW_NUMBER .