SQL实现数据行列转换

时间:2021-11-19 09:09:04

前言:

  在日常的工作中,使用数据库查看数据是很经常的事,数据库的数据非常多,如果此时的数据设计是一行行的设计话,就会有多行同一个用户的数据,查看起来比较费劲,如果数据较多时,不方便查看,为了更加方便工作中查看数据,如果可以随时切换行列数据的显示就好啦。

上图详细看这种情况:同一个test学生,有多门学科的成绩,每科成绩为一行,如果学生比较多的时候,这样一行一个成绩,是不是觉得查看比较麻烦呢?可不可以将所有学科的成绩都放到同一行呢?答案是肯定的!!

SQL实现数据行列转换

最终要实现的效果:

SQL实现数据行列转换

如下图的最终实现结果,自定义了各个科目来存放成绩,要实现这种效果,就需要加个条件去判断当前科目和获取到成绩,可以使用IF或case when 去判断

第一种:IF + 分组 +MAX/SUM

SQL实现数据行列转换

逐步分析为什么要这么写?

  • 使用IF根据科目来进行筛选,如果当前为linux,直接取它的分数,其他为0,可以看到test学生的linux列中,只有第一行有分数,其他两行都为0,这样就可以先获得和预期结果比较相应的显示样式了

SQL实现数据行列转换

  • 接着分析此时显示结果,以各个科目进行分类了,由于表中存在多个学生,需要一个以同一个学生为分组,使用group by进行分组
  • 分组后,使用MAX在同一个组里 取大值 或 SUM求和

  如图中的test的三行内容是属于同一个组别的,在这一组中求最大值

  SQL实现数据行列转换

最终的SQL和效果:

SQL实现数据行列转换

第二种:使用CASE WHEN ...THEN ..ELSE... +MAX/SUM

步骤说明:这里的步骤的道理与IF的相同,先用case..when按照各个科目进行分列,然后按照同一个同学进行分组,再使用MAX或SUM ,就可以实现从列转为行啦!

SQL实现数据行列转换