I have a list of students in the student table. I have a list of exams in the exam table. There is a score table with the following columns studentID, examID and score. I want to create a matrix report with students in the rows and exams in the columns

The report will look like this:

Student NameExam 1Exam 2
Vijay7383
Rahul7964
If we can get the SQL select statement as SELECT StudentName, Exam 1, Exam 2 FROM TempTable, we can accomplish this matrix report. The whole point is writing a stored procedure to create this matrix table. Below is the SQL stored procedure for creating the matrix. This involves cursors and dynamic SQL:

CREATE PROCEDURE [dbo].[GetScoreMatrix] AS

CREATE TABLE #Temp
(
   StudentName VARCHAR(50)
)

DECLARE @sTable VARCHAR(1000)
DECLARE @sCol VARCHAR(1000)
SET @sTable = 'ALTER TABLE #Temp ADD '

DECLARE cExam CURSOR FOR 
SELECT ExamName FROM Exam

OPEN cExam
DECLARE @sExamName VARCHAR(50)

FETCH NEXT FROM cExam INTO @sExamName

WHILE @@FETCH_STATUS = 0
BEGIN

SET @sCol = @sTable + '[' + @sExamName + '] INT NULL'
EXEC (@sCol)

FETCH NEXT FROM cExam INTO @sExamName
END

CLOSE cExam
DEALLOCATE cExam


INSERT INTO #Temp (StudentName)
SELECT StudentName FROM Student


DECLARE cScore CURSOR FOR
SELECT s.StudentName, e.ExamName, x.Score FROM 
STUDENT s INNER JOIN Score x
ON s.StudentID = x.StudentID
INNER JOIN Exam e
ON x.ExamID = e.ExamID


OPEN cScore

DECLARE @sStudName VARCHAR(50)
DECLARE @iScore INT
DECLARE @sUpdate VARCHAR(1000)

FETCH NEXT FROM cScore INTO @sStudName, @sExamName, @iScore

WHILE @@FETCH_STATUS <> -1
BEGIN

SET @sUpdate = 'UPDATE #Temp  '
SET @sUpdate = @sUpdate + 'SET [' + @sExamName + '] = ' + CAST(@iScore AS VARCHAR(3))
SET @sUpdate = @sUpdate + ' WHERE StudentName = ''' + @sStudName + ''''

EXEC (@sUpdate)

FETCH NEXT FROM cScore INTO @sStudName, @sExamName, @iScore 

END

CLOSE cScore
DEALLOCATE cScore

SELECT * FROM #Temp

DROP TABLE #Temp
GO