我有一个包含Mark条目的表。在这里,我想准备一个特定学生的进度表。所以根据测试表中输入的标记。
为此,我使用基于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
有人有建议吗?
答案 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
答案 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