我有学生标记数据设置如下
RegNo Subj1 Mark1 Subj2 Mark2 Subj3 Mark3 Subj4 Mark4
Run Code Online (Sandbox Code Playgroud)
其中Subj是主题名称和给定的标记.
数据是这样的,相同的主题可以在不同学生的任何列中.例如.Student1可能已选择Eng作为Subj1,其中Student2可能已选择Subj2.
现在我要求每个科目的平均值.我怎么找?
你应该修复你的数据结构.通常,当您的列包含相同的数据并且仅在末尾用数字区分时,您的结构就会很糟糕.你想要一个看起来像这样的表:
Regno Subj Mark
Run Code Online (Sandbox Code Playgroud)
每个学生一排subj.这称为联结表,是标准化数据的过程的一部分.
您可以为此查询动态创建一个,但您应该真正修复数据结构:
select subj, avg(mark)
from ((select regno, subj1 as subj, mark1 as mark from studentmark) union all
(select regno, subj2 as subj, mark2 as mark from studentmark) union all
(select regno, subj3 as subj, mark3 as mark from studentmark) union all
(select regno, subj4 as subj, mark4 as mark from studentmark)
) sm
group by sub;
Run Code Online (Sandbox Code Playgroud)
SQL Fiddle中的示例.