转载地址(本文所有代码都曾经运行过)
https://www.cnblogs.com/liunanjava/p/4961923.html
根底表及数据
create table kecheng( id NUMBER, name VARCHAR2(20), course VARCHAR2(20), score NUMBER);insert into kecheng (id, name, course, score)values (1, '张三', '语文', 67);insert into kecheng (id, name, course, score)values (1, '张三', '数学', 76);insert into kecheng (id, name, course, score)values (1, '张三', '英语', 43);insert into kecheng (id, name, course, score)values (1, '张三', '历史', 56);insert into kecheng (id, name, course, score)values (1, '张三', '化学', 11);insert into kecheng (id, name, course, score)values (2, '李四', '语文', 54);insert into kecheng (id, name, course, score)values (2, '李四', '数学', 81);insert into kecheng (id, name, course, score)values (2, '李四', '英语', 64);insert into kecheng (id, name, course, score)values (2, '李四', '历史', 93);insert into kecheng (id, name, course, score)values (2, '李四', '化学', 27);insert into kecheng (id, name, course, score)values (3, '王五', '语文', 24);insert into kecheng (id, name, course, score)values (3, '王五', '数学', 25);insert into kecheng (id, name, course, score)values (3, '王五', '英语', 8);insert into kecheng (id, name, course, score)values (3, '王五', '历史', 45);insert into kecheng (id, name, course, score)values (3, '王五', '化学', 1);commit;
固定行转换
应用decode实现行转列
SELECT ID,NAME,SUM(DECODE(course,'语文',score,0)) 语文,--这里应用max,min都能够SUM(DECODE(course,'数学',score,0)) 数学,SUM(DECODE(course,'英语',score,0)) 英语,SUM(DECODE(course,'历史',score,0)) 历史,SUM(DECODE(course,'化学',score,0)) 化学FROM kechengGROUP BY ID ,NAME
应用case实现行转换
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) 化学FROM kechengGROUP BY ID ,NAME
SELECT id, MAX(CASE WHEN week=1 THEN COURSE_NAME ELSE '' END) WEEK1,MAX(CASE WHEN week=2 THEN COURSE_NAME ELSE '' END) WEEK2,MAX(CASE WHEN week=3 THEN COURSE_NAME ELSE '' END) WEEK3,MAX(CASE WHEN week=4 THEN COURSE_NAME ELSE '' END) WEEK4,MAX(CASE WHEN week=5 THEN COURSE_NAME ELSE '' END) WEEK5,MAX(CASE WHEN week=6 THEN COURSE_NAME ELSE '' END) WEEK6,MAX(CASE WHEN week=7 THEN COURSE_NAME ELSE '' END) WEEK7FROM FORSRCMIDSCHEDULEGROUP BY id
原数据模式
转变后
wmsys.wm_concat实现行转换,并值是自定义形式
SELECT ID,NAME,wmsys.wm_concat(course || '-'||score) courseFROM kechengGROUP BY ID ,NAME;