Oracle—decode函数行转列

来源:互联网 发布:sql语句求和1到50 编辑:程序博客网 时间:2024/06/11 17:18

文章说明:根据成绩表,对每个学生的成绩数据进项行转列操作,最后每行显示每个学生的各科成绩。

以下是行转列的各个步骤操作。


1、创建学生信息,课程,成绩三张表

CREATE TABLE TB_STUDENT(       STUDENTID VARCHAR2(10) PRIMARY KEY,       STUNAME VARCHAR2(50),       SEX VARCHAR2(8),       AGE NUMBER(5) );CREATE TABLE TB_COURSE(       COURSEID VARCHAR2(10) PRIMARY KEY,       COURSENAME VARCHAR2(10),       TEACHER VARCHAR2(10));CREATE TABLE TB_SCORE(       SCOREID VARCHAR2(10) PRIMARY KEY,       COURSEID VARCHAR2(10),       STUDENTID VARCHAR2(10),       GRADE NUMBER(10));

2、给三张表插入相应的数据

INSERT INTO TB_STUDENT(STUDENTID,STUNAME,SEX,AGE) VALUES('20141101','SIM','BOY',22);INSERT INTO TB_STUDENT(STUDENTID,STUNAME,SEX,AGE) VALUES('20141102','MARY','GIRL',22);INSERT INTO TB_STUDENT(STUDENTID,STUNAME,SEX,AGE) VALUES('20141103','SILLY','GIRL',22);INSERT INTO TB_STUDENT(STUDENTID,STUNAME,SEX,AGE) VALUES('20141104','ALICE','GIRL',22);INSERT INTO TB_STUDENT(STUDENTID,STUNAME,SEX,AGE) VALUES('20141105','SAM','BOY',22);insert into tb_course(COURSEID,coursename,teacher) VALUES('1001','MATH','SA');insert into tb_course(COURSEID,coursename,teacher) VALUES('1002','ENGLISH','ALICE');insert into tb_course(COURSEID,coursename,teacher) VALUES('1003','JAVA','BB');INSERT INTO TB_SCORE(SCOREID,COURSEID,STUDENTID,GRADE) VALUES('10001','1001','20141101',99);INSERT INTO TB_SCORE(SCOREID,COURSEID,STUDENTID,GRADE) VALUES('10002','1001','20141102',88);INSERT INTO TB_SCORE(SCOREID,COURSEID,STUDENTID,GRADE) VALUES('10003','1001','20141103',77);INSERT INTO TB_SCORE(SCOREID,COURSEID,STUDENTID,GRADE) VALUES('10004','1001','20141104',98);INSERT INTO TB_SCORE(SCOREID,COURSEID,STUDENTID,GRADE) VALUES('10005','1001','20141105',96);INSERT INTO TB_SCORE(SCOREID,COURSEID,STUDENTID,GRADE) VALUES('10006','1002','20141101',99);INSERT INTO TB_SCORE(SCOREID,COURSEID,STUDENTID,GRADE) VALUES('10007','1002','20141103',99);INSERT INTO TB_SCORE(SCOREID,COURSEID,STUDENTID,GRADE) VALUES('10008','1002','20141104',99);INSERT INTO TB_SCORE(SCOREID,COURSEID,STUDENTID,GRADE) VALUES('10009','1003','20141102',99);INSERT INTO TB_SCORE(SCOREID,COURSEID,STUDENTID,GRADE) VALUES('10010','1003','20141105',99);


插入后的数据结果如下:

STUDENTID  STUNAME                                            SEX         AGE---------- -------------------------------------------------- -------- ------20141101   SIM                                                BOY          2220141102   MARY                                               GIRL         2220141103   SILLY                                              GIRL         2220141104   ALICE                                              GIRL         2220141105   SAM                                                BOY          22COURSEID   COURSENAME TEACHER---------- ---------- ----------1001       MATH       SA1002       ENGLISH    ALICE1003       JAVA       BBSCOREID    COURSEID   STUDENTID        GRADE---------- ---------- ---------- -----------10001      1001       20041101            9910002      1001       20041102            8810003      1001       20041103            7710004      1001       20041104            9810005      1001       20041105            9610006      1002       20041101            9910007      1002       20041103            9910008      1002       20041104            9910009      1003       20041102            9910010      1003       20041105            99

3、对数据进行行转列操作

select g.studentid 学号,(select stu.stuname from tb_student stu where stu.studentid=g.studentid) AS 姓名,sum(decode(g.courseid,'1001',grade,0)) 数学,sum(decode(g.courseid,'1002',grade,0)) 英语,sum(decode(g.courseid,'1003',grade,0)) javafrom tb_score ggroup by g.studentidorder by g.studentid;


说明:decode函数除了可以进行数据匹配以外,还可以进行行转列的功能

decode函数格式:decode(column,if1,then1,defalut)

表示列如果满足if1的条件,就显示then1的内容,不满足就显示default的值!

sum(decode(...))是对decode返回的数据进行累加


4、通过上面的查询,最后显示的查询结果如下

学号       姓名                                                       数学         英语       JAVA---------- -------------------------------------------------- ---------- ---------- ----------20141101   SIM                                                        99         99          020141102   MARY                                                       88          0         9920141103   SILLY                                                      77         99          020141104   ALICE                                                      98         99          020141105   SAM                                                        96          0         99

以上是通过oracle的decode函数进行的行转列操作,初次写博文,多多指教!



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信出现当前登录环境异常该怎么办 去麦加朝觐人要出现死亡怎么办 炉石传说偶数骑削弱后怎么办 出于安全和性能方面的原因怎么办 怀孕后不知道拍过好几次牙片怎么办 百度云种子含有非法离线内容怎么办 苹果手机上的迅雷怎么打不开怎么办 微信绑定银行卡收不到验证码怎么办 支付宝转账为什么没验证码怎么办 电视时间比手机慢三分钟怎么办 13岁现在有月经又流鼻血怎么办 酒店给客人把房间开错了怎么办 手机百度云下载的视频分解了怎么办 知道家人被绑架北派传销怎么办 接手前同事的客人无回复怎么办 喝了酒第二天一直吐怎么办 孩子看的鬼片不敢睡觉害怕怎么办 宝宝满月了脸还有点黄怎么办 我情人天天说没时间出去该怎么办 两个月宝宝下体三角区肿了怎么办 夏养的龙猫家里有味怎么办 不小心踩到仓鼠吐血了怎么办 不小心踩到仓鼠的头怎么办 母仓鼠生完孩子特别暴躁怎么办 被仓鼠咬出血怎么办要不要打针 被小仓鼠咬出血了该怎么办 仓鼠咬破手指流血了该怎么办 小仓鼠的手被棉花丝绑住了怎么办 荷兰猪如果不小心撞流血了怎么办 帮同事刷杯子但把杯子弄坏了怎么办 贵宾犬喜欢张开嘴巴跟人玩怎么办 鼻烟放了几天感觉跟受潮一样怎么办 两个月宝宝鼻屎堵住鼻子怎么办 肉包着智齿怎么办洗燥电影完整版 大腿内侧突然长黑痣越来越大怎么办 肚脐发炎、不脱落怎么办_妈网百科 老公出轨找个按摩的还不离婚怎么办 别人拿错钥匙装修好了房子怎么办 撞车后对方全责却不赔钱怎么办 我的世界国服客户端都是英文怎么办 下载的3d模型没有材质怎么办