我使用的是SQL Server 2005和asp.net 2008年用C#...我有2個表結果和Stud_Info .......程序在SQL Server 2005中轉換行colums需要一些修正
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
第二表是這樣的...
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
我使用這個存儲過程進行動態轉換行到列主題......並能正常工作。
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
目前我越來越喜歡O/P ....
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
注意
這裏我得到了在Exam_Result表和所有科目所有子的總和(以GE你可以看到 - 67)和AVG從Exam_Result
所有科目現在的問題是我想顯示結果通過摸索按照用戶自選....對於例如,如果用戶希望只看到COURSE_ID = MECH和 學期= 1 .... O/P應是....
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
沒有修復不的科目每門課程和semester..it可能會改變....並需要通過COURSE_ID和學期是組給我指導和查詢,所以我會實現你的答案....我希望這個信息就足以說明我的東西....所有answe RS是最歡迎...感謝
是否有人幫我? – mack28 2012-05-02 08:00:08
對不起,我不明白。在遊標查詢中有課程ID和學期過濾器。什麼不行? – 2012-05-02 08:42:18
是的,它的工作原理,但它會顯示Exam_Result表中的所有科目,然後計算所有科目的平均值...... **我想要的是過濾也與科目**,因此它將只顯示在選定Course_Id和學期那個學生......例如** Course_Id = MECH,Semester = 1 **那麼它只能檢索那些在Course_Id = MECH,Semester = 1 **中的科目,然後希望**那個科目的總和**從Exam_Result表,之後,平均也被認爲是結果的百分比....正如你可以看到我的問題... PLZ幫助我....感謝 – mack28 2012-05-02 09:10:34