面试的时候遇到这样一个问题,按照性别、科目 统计学生的平均分 。
如下图
首先很容易想到可以直接 group by 性别、科目获取平均分
sql如下
select Gender,Class,AVG(Score) from Student a left join Score b on a.StuID=b.StuID group by Gender,Class
可是最终的结果如下
与上面的结果显然不同,所以需要将Class这一列转成行。
先把Class单列出来作为行,然后判断性别,填入分数
select Class as 科目, case when Gender='男' then Score end as 男, case when Gender='女' then Score end as 女 from (select Gender,Class,AVG(Score) Score from Student a left join Score b on a.StuID=b.StuID group by Gender,Class) b
这样的结果是
因为每一行只有一个性别,所以另一个性别的数字是空的。这时根据科目取最大值即可
最终答案:
select Class as 科目, max(case when Gender='男' then Score end) as 男, max(case when Gender='女' then Score end) as 女 from (select Gender,Class,AVG(Score) Score from Student a left join Score b on a.StuID=b.StuID group by Gender,Class) b group by Class
所以列转行的步骤:
1.单独查询将要作为行的列,将剩下的列作为判断依据,取出数据
2.然后group by行,取出每个判断语句的最大值
标签:group,Gender,转行,Score,sql,StuID,Class,select,平均分 From: https://www.cnblogs.com/AduBlog/p/17109982.html