sql中经常遇到的行转列问题

    xiaoxiao2022-06-26  105

    1、问题描述:      我们经过深思熟虑在数据库中设计的数据表,最终还是不能适应所有的业务场景。包括在面试过程中会遇到这么一个SQL像我一样菜的人来讲,还是有点难度的,所以今天把这个问题给做一下笔记。我们创建一个成绩表,在成绩表中有这么几个字段“编号(主键自增)、姓名、科目、成绩”,我们需要将每个人对应的科变成列头,然后将科目对应的成绩放在下面,如下图:

    图1:未经过处理前的数据: 图2:经过处理的数据:

    2、咱们先创建一个简单的数据表:

    -- 创建一个成绩表 CREATE TABLE sources( id int identity(1,1) primary key, name VARCHAR(20), projName VARCHAR(20), source INT )

    3、给数据表插入数据:

    INSERT sources SELECT '张三','语文',45 UNION SELECT '张三','数学',68 UNION SELECT '张三','英语',90 UNION SELECT '李四','语文',55 UNION SELECT '李四','数学',38 UNION SELECT '李四','英语',70 UNION SELECT '小二','语文',85 UNION SELECT '小二','数学',98 UNION SELECT '小二','英语',95 UNION SELECT '李逵','语文',75 UNION SELECT '李逵','数学',78 UNION SELECT '李逵','英语',91

    4、下面处理一下这张表:      第一步,咱们先使用case…when…语句进行数据表的结构调整:

    SELECT *, CASE WHEN projName='语文' THEN source END AS chinese, CASE WHEN projName='数学' THEN source END AS math, CASE WHEN projName='英语' THEN source END AS english FROM sources

    效果图:      第二步,咱们队sql语句进行再查询,然后按照学生姓名字段分组处理:

    SELECT MAX(t1.id) as id,t1.name,MAX(t1.chinese) AS 语文,MAX(t1.math) AS 数学,MAX(t1.english) AS 英语 FROM (SELECT *, CASE WHEN projName='语文' THEN source END AS chinese, CASE WHEN projName='数学' THEN source END AS math, CASE WHEN projName='英语' THEN source END AS english FROM sources ) t1 GROUP BY t1.name

    最终效果: 至此,问题解决了。欢迎大家吐槽! 学海无涯苦作舟,我先划船走了,回见!

    男儿在生命里寻觅快乐的方法,就是了解你被赋予生命是为了奉献。


    最新回复(0)