前几天写了一个列转行pviot函数的使用,虽然这个函数挺好用的但是也是有缺陷的。比如只能对数值字段处理,而且只能用聚合函数。上次有个小伙伴就问了如果待处理的字段是字符类型的咋办呢?
今天就来分享一个字符类型的应该如何列转行滴。首先和上次一样先准备好我们要用的数据。
建表:
CREATETABLET_QQ
(班级 VARCHAR2(10),
学号 VARCHAR2(10),
科目 VARCHAR2(20),
评分等级 VARCHAR2(5))/*建表*/
插入数据
1INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '01', '数学', 'A')
2INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '01', '语文', 'A')
3INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '01', '化学', 'B')
4INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '01', '英语', 'B')
5INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '01', '物理', 'C')
6INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '01', '生物', 'A')
7INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '02', '物理', 'C')
8INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '02', '生物', 'A')
9INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '02', '数学', 'A')
10INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '02', '语文', 'B')
11INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '02', '英语', 'A')
12INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '02', '化学', 'D')
13INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '03', '数学', 'A')
14INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '03', '英语', 'B')
15INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '03', '化学', 'A')
16INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '03', '生物', 'E')
17INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '03', '物理', 'B')
18INSERT INTO T_QQ (班级, 学号, 科目, 评分等级) VALUES ('A1231', '03', '语文', 'B')
好啦,我们的数据已经准备好了,我们的表就是这个样子滴。
现在我们想要把科目转成列评分等级是数据应该怎么做呢,现在用pviot已经无法实现了哦。没关系我们还有更厉害的函数——listagg() within group ()。
来看看这个函数怎么用滴:
1select班级,学号,substr(评分情况,1,1) 数学,substr(评分情况,3,1) 语文,substr(评分情况,5,1) 英语,substr(评分情况,7,1) 物理,substr(评分情况,9,1) 化学,substr(评分情况,11,1) 生物
2from
3(select班级,学号,listagg(评分等级,'/')withinGROUP(orderbydecode(科目,'数学',1,'语文',2,'英语',3,'物理',4,'化学',5,'生物',6)) 评分情况
4fromT_QQ
5groupby班级,学号)
1、decode()这个是一个替换函数:
DECODE(value,if1,then1,if2,then2,..,else);
2、substr()这是个截取函数:
SUBSTR( 字符表达式 , 开始截取的位置, 截取的长度) 。
代码结果如下:
listagg(评分等级,'/')within group (order by decode(科目,'数学',1,'语文',2,'英语',3,'物理',4,'化学',5,'生物',6))我们来解析下这段代码吧,listagg(待处理字段,'分隔符') within group(order by (待排序字段))例如我们这里是按照数学、语文、英语、物理、化学、生物这样的顺序来排列评分等级。然后我们将得到的字符串分割一下就可以了。
喜欢我就长按下面这个萌萌的二维码关注我吧~
网友评论