1

我使用的是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是最歡迎...感謝

+0

是否有人幫我? – mack28 2012-05-02 08:00:08

+0

對不起,我不明白。在遊標查詢中有課程ID和學期過濾器。什麼不行? – 2012-05-02 08:42:18

+0

是的,它的工作原理,但它會顯示Exam_Result表中的所有科目,然後計算所有科目的平均值...... **我想要的是過濾也與科目**,因此它將只顯示在選定Course_Id和學期那個學生......例如** Course_Id = MECH,Semester = 1 **那麼它只能檢索那些在Course_Id = MECH,Semester = 1 **中的科目,然後希望**那個科目的總和**從Exam_Result表,之後,平均也被認爲是結果的百分比....正如你可以看到我的問題... PLZ幫助我....感謝 – mack28 2012-05-02 09:10:34

回答

1

回答你這個評論:

它不是在SQL Server 2005的工作爲我的網站它給錯誤消息102,級別15,狀態1,不正確的行'ps'附近的語法。傳遞給SUBSTRING函數無效長度參數。

執行動態查詢時可能會出現第一個錯誤。我不能肯定,但它看起來好像你的數據庫的兼容級別低於90,因此PIVOT不允許/認可。搜索本網站,瞭解如何在沒有PIVOT子句的情況下進行轉換以解決問題。或者如果可能的話,將數據庫的兼容性級別設置爲90。

至於第二個錯誤,我遇到它也當我是測試您的查詢。 (這件事發生時,我沒有爲這些參數指定的值。)錯誤的來源是這一行:

select @subjects = LEFT(@subjects, LEN(@subjects) - 1) 

如果光標查詢沒有返回行,你的@subjects變量保持空LEN(@subjects) - 1結果-1,當其爲長度參數傳遞給LEFT(),產生錯誤。

只需添加一個條件,以避免該問題:

if LEN(@subjects) > 0 select @subjects = LEFT(@subjects, LEN(@subjects) - 1) 

執行相同的其他兩個字符串(@subjectsselection@SumSelection)。

並請,下一次你都在問一個問題,說有什麼不工作,請確保你把所有的相關信息(包括錯誤消息)到你的問題到評論。

+0

Andriy M - 好的,謝謝你的指導...我會記住下一次如何解釋它...我是新的,並意識到這......這就是爲什麼......再次感謝 – mack28 2012-05-02 12:36:25