I’m using SQL Server 2005 and asp.net 2008 with c#…I have 2 tables Result and Stud_Info…….
1] Stud_Info
CREATE TABLE Stud_Info
(Enroll_Number varchar(20) NOT NULL,
Salutation varchar(10) NULL,
First_Name varchar(20) NULL,
Middle_Name varchar(20) NULL,
Last_Name varchar(20) NULL,
Course_Id varchar(20) NULL,
Batch varchar(20) NULL)
INSERT into Stud_Info values(11161,'Mr.','Mack','B','Botha','MECH','Batch1');
INSERT into Stud_Info values(11162,'Mr.','John','A','Los','CIVIL','Batch2');
INSERT into Stud_Info values(11163,'Ms.','Merry','F','Dsuza','ELCT','Batch1');
INSERT into Stud_Info values(11164,'Mr.','Pow','B','Janero','MECH','Batch2');
INSERT into Stud_Info values(11165,'Mr.','Martin','J','Smith','MECH','Batch1');
SELECT * from Stud_Info
2nd Table is like this…
2] Exam_Result
CREATE TABLE Exam_Result
(Result_Id numeric(18, 0) IDENTITY(1,1) NOT NULL,
Enroll_Number varchar(50) NULL,
Student_Name varchar(100) NULL,
Course_Id varchar(50) NULL,
Semester varchar(50) NULL,
Subject_Id varchar(50) NULL,
Subject_Name varchar(50) NULL,
MarksObtained numeric(18, 0) NULL,
Exam_Type varchar(50) NULL)
INSERT into Exam_Result values(11161,'Mack B Botha','MECH',1,'MT','Maths',25,'Internal1');
INSERT into Exam_Result values(11161,'Mack B Botha','MECH',1,'EN','English',22,'Internal1');
INSERT into Exam_Result values(11161,'Mack B Botha','MECH',1,'SC','Science',20,'Internal1');
INSERT into Exam_Result values(11166,'Barden V John','CIVIL',1,'SS','Social',21,'Internal2');
INSERT into Exam_Result values(11161,'Mack B Botha','MECH',2,'SM','Simple Maths',24,'Internal2');
INSERT into Exam_Result values(11161,'Mack B Botha','MECH',2,'SM','Simple Maths',69,'Final');
SELECT * from Exam_Result
I’m Using this stored procedure for dynamic transforming rows-to-columns for Subjects……and it works fine.
Create Proc GetExamResults (@Course_Id varchar(100), @Semester varchar(10))
as
begin
declare @subjname varchar(100)
declare @subjects varchar(7000)
declare @subjectsselection varchar(7000)
declare @SumSelection varchar(7000)
declare @NoOfSubjects int
set @NoOfSubjects = 0
set @subjects = ''
set @subjectsselection = ''
set @SumSelection = ''
DECLARE subject_cursor CURSOR
FOR SELECT distinct Subject_Name FROM Exam_Result where course_id = @Course_Id And Semester = @Semester
OPEN subject_cursor
FETCH NEXT FROM subject_cursor
INTO @subjname
WHILE @@FETCH_STATUS = 0
BEGIN
set @subjects = @subjects + '[' + @subjname + '],'
set @subjectsselection = @subjectsselection + 'Sum(Isnull([' + @subjname + '],0)) As [' + @subjname + '],'
set @SumSelection = @SumSelection + 'Sum(Isnull([' + @subjname + '],0))+'
set @NoOfSubjects = @NoOfSubjects + 1
FETCH NEXT FROM subject_cursor
INTO @subjname
End
CLOSE subject_cursor;
DEALLOCATE subject_cursor;
select @subjects = LEFT(@subjects, LEN(@subjects) - 1)
select @subjectsselection = LEFT(@subjectsselection, LEN(@subjectsselection) - 1)
select @SumSelection = LEFT(@SumSelection, LEN(@SumSelection) - 1)
print @subjects
print @subjectsselection
print @SumSelection
declare @query nvarchar(4000)
set @query = 'select S.Enroll_Number, pvt.Student_Name, pvt.Course_Id, pvt.Semester, ' + @subjectsselection + ','
set @query = @query + 'Exam_Type,' + @SumSelection + ' As Grand_Total, '
set @query = @query + '(' + @SumSelection + ')' + '/' + convert(varchar(10),@NoOfSubjects) + ' As Avg'
set @query = @query + ' From '
set @query = @query + '(select Enroll_Number, Student_Name, Course_Id, Semester, Subject_Name, MarksObtained, Exam_Type from Exam_Result ) ps '
set @query = @query + ' pivot(sum(MarksObtained) for Subject_Name in (' + @subjects + ')) as pvt'
set @query = @query + ' inner join Stud_Info S on S.Enroll_Number = pvt.Enroll_Number '
set @query = @query + ' where pvt.Course_Id = ''' + @Course_Id + ''' and pvt.Semester = ''' + @Semester + ''''
set @query = @query + ' group by S.Enroll_Number, pvt.Student_Name, pvt.Course_Id, pvt.Semester, Exam_Type'
print @query
exec sp_executesql @query
end
Currently i’m getting o/p like….
Enroll_Number Student_Name Course_Id Semester Maths English Science Social Smathas total avg
11161 MACK MECH 1 25 22 20 0 0 67 total/all sub
11166 Barden CIV 1 0 0 0 21 0 21 total/all sub
NOTE
here i’m getting all subjects that are in Exam_Result Table and sum of all sub (in ge you can see – 67) and avg of all subjects from Exam_Result
NOW QUESTION IS I WANT TO DISPLAY RESULTS BY GROPING AS PER USER CHOICE…. for eg if user wants to see only Course_Id = MECH and
Semester = 1….o/p should be….
Enroll_No Student_Name Course_ID Semester Maths English Science Type Grand_Total Avg
11161 Mack B Botha MECH 1 25 22 20 internal1 67 66.22
There is no fix no of subjects in every course and semester..it might be change….and needs to be group by Course_Id and Semester Give me guidance and query so i will implement your answer….I hope this information is enough to explain my stuff….all answers are most welcome…thanks
Answering this comment of yours:
The first error probably occurs when your dynamic query is executed. I can’t be sure but it looks as if the compatibility level of your database is lower than 90 and thus
PIVOTis not allowed/recognised. Search this site for questions on how to pivot without the PIVOT clause to work around it. Or set your DB’s compatibility level to 90, if possible.As for the second error, I encountered it too when I was testing your query. (It happened when I didn’t specify values for the parameters.) The source of the error is this line:
If the cursor query doesn’t return rows, your
@subjectsvariable remains empty andLEN(@subjects) - 1results in-1, which, when passed as the length argument toLEFT(), produces the error.Simply add a condition to avoid the issue:
Do the same for the other two strings (
@subjectsselectionand@SumSelection).And please, next time you are asking a question and saying that something is not working, make sure you put all the relevant information (including error messages) into your question, not into a comment.