1

我有一个问题,我需要将学生的学科名称(例如英语、科学……)显示为列,并在每个学科下显示其各自的分数。我查询数据库并将这些值作为数据集中的行而不是列。我应该如何查询数据库?

我的查询结果

student name | marks  | Subectname
------------------------------------
raghuram        78         english
raghuram        34         physics
raghuram        76         chemistry

 ................              ...         ..........

报告中要求的结果

studentname | english | Maths | physics | ......
----------------------------------------------------
raghuram        78       66        32

这是我的查询

SELECT
    st.FirstName + ' ' + st.LastName as StudentName,
    s.Subject_Name, se.Mark 
FROM
    dbo.FEE_STUDENT_EXAM se
INNER JOIN 
    dbo.FEE_STUDENT_GRADE sg ON sg.Student_ID=se.Student_ID
INNER JOIN 
    FEE_STUDENT st ON st.Student_ID=sg.Student_ID
INNER JOIN 
    dbo.EMP_SUBJECT s ON s.SubjectID=se.Subject_ID
WHERE
    sg.Grade_ID = @GradeId 
    AND sg.Division_ID = @DivId 
    AND se.Subject_ID IN (SELECT d.SubjectId 
                          FROM dbo.FEE_STUDENT_EXAM_SCHEDULED d 
                          INNER JOIN dbo.FEE_STUDENT_EXAM_SCHEDULEH h ON h.ExamScheduleID = d.ExamScheduleID 
                          WHERE h.Grade_Id = @GradeId AND h.Division_ID = @DivId 
                            AND YEAR(CAST(d.TestDate AS DATETIME)) = @Year
                            AND MONTH(CAST(d.TestDate AS DATETIME)) = @Month)
4

1 回答 1

0

添加GROUP BY到您的查询和max(case...)您需要的每个主题:

    Select st.FirstName+' '+st.LastName as
           StudentName,

          max(case when s.Subject_Name = 'english' then se.Mark else 0 end) as english,     
          max(case when s.Subject_Name = 'Maths' then se.Mark else 0 end) as Maths,
          max(case when s.Subject_Name = 'physics' then se.Mark else 0 end) as physics,
.........

     from   dbo.FEE_STUDENT_EXAM se
                   inner join dbo.FEE_STUDENT_GRADE sg on sg.Student_ID=se.Student_ID
                   inner join FEE_STUDENT st on st.Student_ID=sg.Student_ID
                   inner join dbo.EMP_SUBJECT s on s.SubjectID=se.Subject_ID
                   where sg.Grade_ID=@GradeId and sg.Division_ID=@DivId and
                   se.Subject_ID in(Select  d.SubjectId from dbo.FEE_STUDENT_EXAM_SCHEDULED d inner join 
                   dbo.FEE_STUDENT_EXAM_SCHEDULEH h on h.ExamScheduleID=d.ExamScheduleID where 
                   h.Grade_Id=@GradeId and h.Division_ID=@DivId and year(cast (d.TestDate as datetime))=@Year
                   and month(cast (d.TestDate as datetime))=@Month)

               Group by se.Student_ID
于 2012-10-18T05:48:46.740 回答