SQL Server查询中的问题

时间:2013-08-07 06:04:21

标签: sql sql-server

我有一个包含Mark条目的表。在这里,我想准备一个特定学生的进度表。所以根据测试表中输入的标记。

  • 测试1包含所有科目标记,即英语,植物学等。
  • 测试2还包含主题
  • 的标记

为此,我使用基于testid

union all查询
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

有人有建议吗?

3 个答案:

答案 0 :(得分:3)

您也可以使用PIVOT。 PIVOT只需在FOR TestId IN ([1], [2])子句

中添加更多值即可轻松添加更多测试
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

PIVOT

SQLFiddle here

答案 1 :(得分: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

答案 2 :(得分: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