0

我有一个包含标记条目的表。在这里我要准备一个特定学生的进度表。以便根据测试输入表格中的分数。

  • 测试 1 包含所有科目的分数,即英语、植物学等。
  • 测试 2 也包含科目的分数

为此,我使用了union all基于 testid的查询

select distinct 
    W.SubjectName, W.StudentId, W.Test1, W.Test2
from
    (select distinct 
         SB.SubjectName, ME.StudentId, ME.Mark as Test1, 0 as Test2
     from 
         MarkEntry ME 
     inner join 
         Subject SB on SB.SubjectId = ME.SubjectId
     where 
         ME.TestId = 1 
         and ME.GradeId = 5 
         and ME.SectionId = 9 
         and ME.TermId = 1 
         and ME.LevelId = 1 
         and ME.StreamId = 2 
         and ME.AcYear = 14
    group by 
         ME.Mark, ME.StudentId, SB.SubjectName

    union all 

    select distinct 
        SB.SubjectName, ME.StudentId, 0 as Test1, ME.Mark as Test2 
    from 
        MarkEntry ME 
    inner join 
        Subject_DT SB on SB.SubjectId = ME.SubjectId
    where 
        ME.TestId = 2 
        and ME.GradeId = 5 
        and ME.SectionId = 9 
        and ME.TermId = 1 
        and ME.LevelId = 1 
        and ME.StreamId = 2 
        and ME.AcYear = 14
    group by 
        ME.Mark, ME.StudentId, SB.SubjectName) W 
where 
   W.StudentId = 1052 
group by 
   W.StudentId, W.Test1, W.Test2, W.SubjectName

我的结果是这样的:

SubjectName   StudentId   Test1   Test2
-------------------------------------------------    
English       1052         0.0    23.0
Botany        1052         0.0    32.0
Zoology       1052         0.0    32.0
Botany        1052        10.0     0.0
English       1052        10.0     0.0
Zoology       1052        20.0     0.0

但我需要这样

SubjectName   StudentId    Test1   Test2
---------------------------------------------    
English       1052         10.0     23.0
Botany        1052         10.0     32.0
Zoology       1052         20.0     32.0

有人有建议吗?

4

3 回答 3

3

您也可以为此使用 PIVOT。FOR TestId IN ([1], [2])PIVOT 只需向子句添加更多值即可轻松添加更多测试

SELECT *
FROM (
  SELECT S.SubjectName, ME.StudentId, ME.TestID, ME.Mark
  FROM Subject S
  INNER JOIN MarkEntry ME ON S.SubjectId = ME.SubjectId
  /* add this for your query
  WHERE ME.TestId=1 
  AND ME.GradeId=5 
  AND ME.SectionId=9 
  AND ME.TermId=1 
  AND ME.LevelId=1 
  AND ME.StreamId=2 
  AND ME.AcYear=14
  */
) AS StudentMarks
pivot (max(Mark) FOR TestId IN ([1], [2])
) AS pvt
WHERE StudentId = 1

SQLFiddle在这里

于 2013-08-07T06:19:19.813 回答
1

我错过了什么,或者你可以通过加入来做到这一点吗?

select SB.SubjectName, ME1.StudentId, ME1.Mark as Test1, ME2.Mark as Test2
from MarkEntry ME1
inner join MarkEntry ME2 on ME2.SubjectId = ME1.SubjectId
                        and ME2.StudentId = ME1.StudentId
inner join Subject SB on SB.SubjectId = ME1.SubjectId
where ME1.TestId = 1 
and   ME1.GradeId = 5 
and   ME1.SectionId = 9 
and   ME1.TermId = 1 
and   ME1.LevelId = 1 
and   ME1.StreamId = 2 
and   ME1.AcYear = 14

and   ME2.TestId = 2 
and   ME2.GradeId = 5 
and   ME2.SectionId = 9 
and   ME2.TermId = 1 
and   ME2.LevelId = 1 
and   ME2.StreamId = 2 
and   ME2.AcYear = 14

and   ME1.StudentId = 1052
于 2013-08-07T06:58:35.670 回答
0

你已经明白了,你只需要修复分组并选择测试结果的最大值。

我认为可能有更好的方法,但这应该有效:

SELECT DISTINCT
        W.SubjectName ,
        W.StudentId ,
        MAX(W.Test1) ,
        MAX(W.Test2)
FROM    ( SELECT DISTINCT
                    SB.SubjectName ,
                    ME.StudentId ,
                    ME.Mark AS Test1 ,
                    0 AS Test2
          FROM      MarkEntry ME
                    INNER JOIN Subject SB ON SB.SubjectId = ME.SubjectId
          WHERE     ME.TestId = 1
                    AND ME.GradeId = 5
                    AND ME.SectionId = 9
                    AND ME.TermId = 1
                    AND ME.LevelId = 1
                    AND ME.StreamId = 2
                    AND ME.AcYear = 14
          GROUP BY  ME.Mark ,
                    ME.StudentId ,
                    SB.SubjectName
          UNION ALL
          SELECT DISTINCT
                    SB.SubjectName ,
                    ME.StudentId ,
                    0 AS Test1 ,
                    ME.Mark AS Test2
          FROM      MarkEntry ME
                    INNER JOIN Subject_DT SB ON SB.SubjectId = ME.SubjectId
          WHERE     ME.TestId = 2
                    AND ME.GradeId = 5
                    AND ME.SectionId = 9
                    AND ME.TermId = 1
                    AND ME.LevelId = 1
                    AND ME.StreamId = 2
                    AND ME.AcYear = 14
          GROUP BY  ME.Mark ,
                    ME.StudentId ,
                    SB.SubjectName
        ) W
WHERE   W.StudentId = 1052
GROUP BY W.StudentId ,
        W.SubjectName
于 2013-08-07T06:10:07.207 回答