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 に答える