首页 > 数据库 >Oracle中的行列转换-行转列

Oracle中的行列转换-行转列

时间:2023-10-09 16:27:07浏览次数:34  
标签:insert 行列 name course 转列 score chengji Oracle id

 

--建立一张表

create table chengji
(
id NUMBER,
name VARCHAR2(20),
course VARCHAR2(20),
score NUMBER
);

--导入数据
insert into chengji (id, name, course, score)
values (1, '张三', '语文', 67);
insert into chengji (id, name, course, score)
values (1, '张三', '数学', 76);
insert into chengji (id, name, course, score)
values (1, '张三', '英语', 43);
insert into chengji (id, name, course, score)
values (1, '张三', '历史', 56);
insert into chengji (id, name, course, score)
values (1, '张三', '化学', 11);
insert into chengji (id, name, course, score)
values (2, '李四', '语文', 54);
insert into chengji (id, name, course, score)
values (2, '李四', '数学', 81);
insert into chengji (id, name, course, score)
values (2, '李四', '英语', 64);
insert into chengji (id, name, course, score)
values (2, '李四', '历史', 93);
insert into chengji (id, name, course, score)
values (2, '李四', '化学', 27);
insert into chengji (id, name, course, score)
values (3, '王五', '语文', 24);
insert into chengji (id, name, course, score)
values (3, '王五', '数学', 25);
insert into chengji (id, name, course, score)
values (3, '王五', '英语', 58);
insert into chengji (id, name, course, score)
values (3, '王五', '历史', 45);
insert into chengji (id, name, course, score)
values (3, '王五', '化学', 21);
insert into chengji (id, name, course, score)
values (4, 'Jack', '语文', 86);
insert into chengji (id, name, course, score)
values (4, 'Jack', '数学', 90);
insert into chengji (id, name, course, score)
values (4, 'Jack', '英语', 93);
insert into chengji (id, name, course, score)
values (4, 'Jack', '历史', 77);
insert into chengji (id, name, course, score)
values (4, 'Jack', '化学', 33);
insert into chengji (id, name, course, score)
values (5, 'Helen', '语文', 89);
insert into chengji (id, name, course, score)
values (5, 'Helen', '数学', 97);
insert into chengji (id, name, course, score)
values (5, 'Helen', '英语', 95);
insert into chengji (id, name, course, score)
values (5, 'Helen', '历史', 73);
insert into chengji (id, name, course, score)
values (5, 'Helen', '化学', 29);
commit;

数据展示

 

1.dedode函数

decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)
这个是decode的表达式,具体的含义解释为:
IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)
    ......
ELSIF 条件=值n THEN
    RETURN(翻译值n)
ELSE
    RETURN(缺省值)
END IF


SELECT id,name,
sum(decode(course,'语文',score,0)) 语文,
sum(decode(course,'数学',score,0)) 数学,
sum(decode(course,'英语',score,0)) 英语,
sum(decode(course,'历史',score,0)) 历史,
sum(decode(course,'化学',score,0)) 化学,
sum(score) 总成绩
from chengji
GROUP BY id,name
ORDER BY id;

 

 

 

2.case when

case when end编写和维护较麻烦,但是适合的场景较多。

SELECT id,name,
max(case when course='语文' then score else 0 end) 语文,
max(case when course='数学' then score else 0 end) 数学,
max(case when course='英语' then score else 0 end) 英语,
max(case when course='化学' then score else 0 end) 化学,
max(case when course='历史' then score else 0 end) 历史,
sum(score) 总成绩
from chengji
GROUP BY id,name
ORDER BY id;

 

3.pivot

SELECT * FROM chengji
pivot(max(score) for course in( --course 即要转成列的字段
'语文' as 语文, --max(score) 此处必须为聚合函数
'数学' as 数学, --in () 对要转成列的每一个值指定一个列名
'英语' as 英语,
'化学' as 化学,
'历史' as 历史
))
WHERE 1=1 --这里可以写查询条件,没有可以直接不要where
ORDER BY id;

 

————————————————
版权声明:本文为CSDN博主「Dy_dan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Jason_05/article/details/90741317

补充:表中一行作为字段名称,一行作为字段值;字段值列分为数值型和字符串型:数值型可按上述,字符串类型只要修改为 max(case when item_name ='姓名' then ITEM_VALUE else '' end ) 姓名。

 

标签:insert,行列,name,course,转列,score,chengji,Oracle,id
From: https://www.cnblogs.com/19li/p/17752023.html

相关文章

  • 用bat脚本启动和停止系统服务,如oracle等
    启动脚本启动oracle.bat::取得管理员权限:Main@echooffcd/d"%~dp0"cacls.exe"%SystemDrive%\SystemVolumeInformation">nul2>nulif%errorlevel%==0gotoAdminifexist"%temp%\getadmin.vbs"del/f/q"%temp%\getadmin.v......
  • oracle存储过程声明及调用
    一、声明--此过程用于删除多余扎帐数据--IN_MZZZID:门诊扎帐ID--OUT_MESSAGE:输出执行结果信息createorreplaceprocedurep_out_yl_mz_mzzz_del(IN_MZZZIDINVARCHAR2,OUT_MESSAGEOUTVARCHAR2)isv_msgvarchar2(32767);begininsertintoBHIS.YL_......
  • openGauss学习笔记-93 openGauss 数据库管理-访问外部数据库-oracle_fdw
    openGauss学习笔记-93openGauss数据库管理-访问外部数据库-oracle_fdwopenGauss的fdw实现的功能是各个openGauss数据库及远程服务器(包括数据库、文件系统)之间的跨库操作。目前支持的远程服务器类型包括Oracle、MySQL(MariaDB)、openGauss(postgres_fdw)、file_fdw、dblink。oracle......
  • Oracle 把某一个字段合并到一起
    Oracle把某一个字段合并到一起 column1column2column3id_1name_1    lable_1id_1name_1    lable_2 变为column1column2column3id_1name_1    lable_1,lable_2 --SQL--selectcode,name,wmsys.wm_concat(baname)fromtabgroupbycode,na......
  • 记一次ORACLE的离奇故障,ORACLE bug导致数据库连接时断时通
    故障表现:Windowsserver平台下Java应用程序和plsqldeveloper客户端都无法连接数据库plsqldeveloper 报错ora-12541sqlplus报错ora-12560用 lsnrctlstatus查看监听则一直显示正在连接...处理过程:首先排除网络问题,因为是localhost连接的开始想是监听配置问题吧,......
  • node-oracledb nodejs 包支持thin 模式了
    node-oracledb从v6.0.0版本来时支持thin模式了,是基于纯javascript开发的驱动,我们终于可以不用依赖比较笨重的oracleclient了属于一个很大的进度,同时python版本也是支持thin模式了,我以前也简单介绍过参考资料https://github.com/oracle/node-oracledb/releaseshttps://me......
  • oracle添加表说明
    1、添加表的中文说明#添加表中文说明COMMENTONTABLETEST.EMPLOYEEIS'员工表';#查看说明select*fromdba_tab_comments;2、表字段添加说明#表字段添加说明COMMENTONCOLUMNTEST.EMPLOYEE.EMP_DESCRIPTIONIS'员工描述信息';#查看列的中文说明select*from......
  • 直播平台源码,FlinkSQL实现行转列
    直播平台源码,FlinkSQL实现行转列1、使用UNNEST解析 select name,course,scorefromods_kafka_student_scores CROSSJOINUNNEST(`list`)ASt(course,score);select name,course,scorefromods_kafka_student_scores,UNNEST(`list`)ASt(course,score);select name......
  • Oracle 截取指定字符到目标串的末尾
    Oracle截取指定字符到目标串的末尾substr('目标字符串',开始位置,结束位置)instr('目标字符串','指定字符',出现次数-1表示最后一次)SELECT--目标字符串目标字符串指定符号最后一个......
  • [转]oracle listener.ora中PLSExtPro 和ExtProc的作用(过时组件,官方建议删除以避免漏
    默认安装时,会安装一个PL/SQL外部程序(ExtProc)条目在listener.ora中,是oracle为调用外部程序默认配置的监听,它的名字通常是ExtProc或PLSExtProc,但一般不会使用它,可以直接从listener.ora中将这项移除,因为对ExtProc已经有多种攻击手段了,在不使用外部程序时,oracle也是建议删除的。PLSEx......