• SQL面试题之行转列问题万能模板(过程详细且清晰)


    【题目】

    下面是表名为cook的表

     要求查询结果如下:

    【解题思路】

    就是将一维表转化为二维表

     

    1.输出行列互换的表结构

    可以看出,需要输出的有5列,其中只有“年”这一列是表cook中原有的,其他4列(也就是2-5列:m1对应的是1月份、m2对应的是2月份、m3对应的是3月份、m4对应的是4月份)需要自己创建。

     

    1. select 年,m1,m2,m3,m4
    2. from cook;

     可以看出查询结果和目标表的列名结构一样,但是2-5列(m1、m2、m3、m4)的值不是题目要求的:

    2. 如何将2-5列的值替换成对应的值?

     可以用case语句进行条件判断来替换。

    年份和月份匹配,则为对应值,不匹配则为0。

    1. select 年,
    2. (casewhen '1' then 值 else 0 end) as m1,
    3. (casewhen '2' then 值 else 0 end) as m2,
    4. (casewhen '3' then 值 else 0 end) as m3,
    5. (casewhen '4' then 值 else 0 end) as m4
    6. from cook;

     在这个查询结果中,每一行表示某年某月的某个值。比如第一行是2009年 1月份(m1)的值,而其他三列m2、m3、m4的值为0。

    第二行是2009年 2月份(m2)的值,而其他三列的值为0。其他行以此类推。

    又向目标接近了一步,但是多出来的0值,怎么办? 

    3.去掉0值,简化表格的行数

    可以使用分组汇总来实现。按“年”分组(group by),然后用汇总函数(max)取出每组非零的值(也就是这个案例中的某年某月对应的数值)。

    1. select 年,
    2. max(casewhen '1' thenelse 0 end) as 'm1',
    3. max(casewhen '2' thenelse 0 end) as 'm2',
    4. max(casewhen '3' thenelse 0 end) as 'm3',
    5. max(casewhen '4' thenelse 0 end) as 'm4'
    6. from cook
    7. group by 年;

    这个sql的运行过程如下:

     

    这样我们就得到了目标表(行列互换)。

    【本题考点】

    1.考查用case语句进行数据替换,和条件判断

     

    2.遇到行列互换的问题,可以用下面的万能模版来解决。

     

    1. select A,
    2. -- 第2步,在行列互换结果表中,其他列里的值分别使用case和max来获取
    3. max(case B when 'm' then C else 0 end) as 'm',
    4. max(case B when 'n' then C else 0 end) as 'n'
    5. from cook
    6. -- 第1步,在行列互换结果表中按第1列分组
    7. group by A;

     【举一反三】

    下面是学生的成绩表(表名:成绩表,列名:学号,课程,成绩)

    使用sql语句实现将该表行转化为下面的表结构:

     参考答案:

    1. select 学号,
    2. -- 第2步,在行列互换结果表中,其他列里的值分别使用case和max来获取
    3. max(case 课程 when '语文' then 成绩 else 0 end) as 语文成绩,
    4. max(case 课程 when '数学' then 成绩 else 0 end) as 数学成绩
    5. from 成绩表
    6. -- 第1步,在行列互换结果表中按第1列分组
    7. group by 学号;

     

     

  • 相关阅读:
    JAVA面试题 --- Kafka篇
    【架构整洁之道系列】(四)软件架构师与软件架构
    SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.12 j2cache 基本操作 5.12.3 j2cache 基本操作
    Vivado 综合后工程
    第2章Linux常用命令(下)
    阿里云服务器e系列性价比首选?性能如何?
    QEMU开发入门
    新库上线 | CnOpenData中国保险机构网点全集数据
    Springboot之Actuator信息泄露漏洞利用
    Vscode爆红Delete `␍`eslintprettier/prettier
  • 原文地址:https://blog.csdn.net/qq_41404557/article/details/126117637