SQL极简教程 · MySQL · MyBatis · JPA 技术笔记 教程 总结

sql疑难杂症—字符字段列转行(二)

2018-12-10  本文已影响9人  无言泪落

前几天写了一个列转行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 (待排序字段))例如我们这里是按照数学、语文、英语、物理、化学、生物这样的顺序来排列评分等级。然后我们将得到的字符串分割一下就可以了。

喜欢我就长按下面这个萌萌的二维码关注我吧~

上一篇 下一篇

猜你喜欢

热点阅读