Oracle中实现行列互转的方法分享
更新时间:2023年06月15日 09:13:06 作者:牛奶咖啡13
这篇文章主要为大家总结了Oracle中实现行列互转的简单方法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
一、使用Case when 实现列转为行(多行一列-->一行多列)
1.1、实现效果
①原表效果

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

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、实现效果
①原表效果

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

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;

②将查询到的每个部门人数的结果集【转为一行】
--将上面的结果转为一行,可以使用 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);四、将结果集转为多行

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行列互转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
相关文章
windows使用sqlpus连接oracle 数据库的教程图解
这篇文章主要介绍了windows使用sqlpus连接oracle 数据库的教程图解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下2019-08-08
Oracle SYS用户无法登录数据库ORA-12162的解决方法
文章解析Oracle SYSDBA用户OS登录错误(ORA-12162)原因及解决方法,指出未设置ORACLE_HOME和ORACLE_SID环境变量导致系统无法识别实例,进而无法连接数据库,同时介绍了SYS用户权限、数据字典管理及两种登录认证方式(操作系统认证和数据库认证)2025-08-08


最新评论