Oracle中实现行列互转的方法分享

2023-12-07 0 429
目录
  • 一、使用Case when 实现列转为行(多行一列–>一行多列)
    • 1.1、实现效果
    • 1.2、列转行(多行一列–>一行多列)
  • 二、使用 Case When 实现行转列(一行多列–>多行一列)
    • 2.1、实现效果
    • 2.2、行转列(一行多列–>多行一列)
  • 三、将结果集转为一行
    • 四、将结果集转为多行

      一、使用Case when 实现列转为行(多行一列–>一行多列)

      1.1、实现效果

      ①原表效果

      Oracle中实现行列互转的方法分享

      ②实现将Course课程列内容转为行效果【实现将每个人员的课程信息合成一行,且获取到课程总分】

      Oracle中实现行列互转的方法分享

      1.2、列转行(多行一列–>一行多列)

      sql语句

      SELECT NAME,
      MAX(CASE WHEN COURSE=\’语文\’ THEN SCORE END) \”语文\”,
      MAX(CASE WHEN COURSE=\’数学\’ THEN SCORE END) \”数学\”,
      MAX(CASE WHEN COURSE=\’英语\’ THEN SCORE END) \”英语\”,
      MAX(CASE WHEN COURSE=\’物理\’ THEN SCORE END) \”物理\”,
      SUM(SCORE) \”总分\”
      FROM stu GROUP BY NAME;

      二、使用 Case When 实现行转列(一行多列–>多行一列)

      2.1、实现效果

      ①原表效果

      Oracle中实现行列互转的方法分享

      ②实现将多个数字列转为一列效果

      Oracle中实现行列互转的方法分享

      2.2、行转列(一行多列–>多行一列)

      sql语句

      SELECT NAME,
      CASE
      WHEN LV = 1 THEN \’语文\’ –常量
      WHEN LV = 2 THEN \’数学\’ –常量
      WHEN LV = 3 THEN \’英语\’ –常量
      WHEN LV = 4 THEN \’物理\’ –常量
      END 科目,
      CASE
      WHEN LV = 1 THEN langu –列名
      WHEN LV = 2 THEN math–列名
      WHEN LV = 3 THEN english–列名
      WHEN LV = 4 THEN pycial–列名
      END 成绩
      FROM ( SELECT * FROM course, (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 4) ) –成绩对应的列数
      ORDER BY 1, 2;

      三、将结果集转为一行

      ①查询到每个部门的人数

      –查询每个部门的人数
      SELECT DEPTNO, COUNT(1) CN FROM EMP GROUP BY DEPTNO ORDER BY 1;

      Oracle中实现行列互转的方法分享

      ②将查询到的每个部门人数的结果集【转为一行】

      –将上面的结果转为一行,可以使用 SUM 或者 COUNT 来求出。
      SELECT SUM(CASE WHEN DEPTNO = 10 THEN 1 END) D_10,
      SUM(CASE WHEN DEPTNO = 20 THEN 1 END) D_20,
      SUM(CASE WHEN DEPTNO = 30 THEN 1 END) D_30
      FROM EMP;
      –也可以使用下面的方法。
      SELECT CASE WHEN DEPTNO = 10 THEN CN END D_10,
      CASE WHEN DEPTNO = 20 THEN CN END D_20,
      CASE WHEN DEPTNO = 30 THEN CN END D_30
      FROM (SELECT DEPTNO, COUNT(1) CN FROM EMP GROUP BY DEPTNO);
      –和刚讲的一样,生成了三行三列数据,使用 MAX 来获取。
      SELECT MAX(CASE WHEN DEPTNO = 10 THEN CN END) D_10,
      MAX(CASE WHEN DEPTNO = 20 THEN CN END) D_20,
      MAX(CASE WHEN DEPTNO = 30 THEN CN END) D_30
      FROM (SELECT DEPTNO, COUNT(1) CN FROM EMP GROUP BY DEPTNO);

      四、将结果集转为多行

      Oracle中实现行列互转的方法分享

      SELECT MAX(CASE JOB WHEN \’CLERK\’ THEN ENAME END) CLERK,
      MAX(CASE JOB WHEN \’ANALYST\’ THEN ENAME END) ANALYST,
      MAX(CASE JOB WHEN \’MANAGER\’ THEN ENAME END) MANAGER,
      MAX(CASE JOB WHEN \’PRESIDENT\’ THEN ENAME END) PRESIDENT,
      MAX(CASE JOB WHEN \’SALESMAN\’ THEN ENAME END) SALESMAN
      FROM (SELECT ENAME,
      JOB,
      –每组都是从 1 开始排序,而每列里面只有一组有数据。也就是 RN 相同的在每列里面只有一条数据
      ROW_NUMBER() OVER(PARTITION BY JOB ORDER BY ENAME) RN
      FROM EMP)
      GROUP BY RN
      ORDER BY RN;

      到此这篇关于Oracle中实现行列互转的方法分享的文章就介绍到这了,更多相关Oracle行列互转内容请搜索悠久资源以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源!

      收藏 (0) 打赏

      感谢您的支持,我会继续努力的!

      打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
      点赞 (0)

      悠久资源 Oracle Oracle中实现行列互转的方法分享 https://www.u-9.cn/database/oracle/121792.html

      常见问题

      相关文章

      发表评论
      暂无评论
      官方客服团队

      为您解决烦忧 - 24小时在线 专业服务