打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Oracle中的行列转换
  • 首先建一个表
  1. create table chengji
  2. (
  3. id NUMBER,
  4. name VARCHAR2(20),
  5. course VARCHAR2(20),
  6. score NUMBER
  7. );
  1. insert into chengji (id, name, course, score)
  2. values (1, '张三', '语文', 67);
  3. insert into chengji (id, name, course, score)
  4. values (1, '张三', '数学', 76);
  5. insert into chengji (id, name, course, score)
  6. values (1, '张三', '英语', 43);
  7. insert into chengji (id, name, course, score)
  8. values (1, '张三', '历史', 56);
  9. insert into chengji (id, name, course, score)
  10. values (1, '张三', '化学', 11);
  11. insert into chengji (id, name, course, score)
  12. values (2, '李四', '语文', 54);
  13. insert into chengji (id, name, course, score)
  14. values (2, '李四', '数学', 81);
  15. insert into chengji (id, name, course, score)
  16. values (2, '李四', '英语', 64);
  17. insert into chengji (id, name, course, score)
  18. values (2, '李四', '历史', 93);
  19. insert into chengji (id, name, course, score)
  20. values (2, '李四', '化学', 27);
  21. insert into chengji (id, name, course, score)
  22. values (3, '王五', '语文', 24);
  23. insert into chengji (id, name, course, score)
  24. values (3, '王五', '数学', 25);
  25. insert into chengji (id, name, course, score)
  26. values (3, '王五', '英语', 58);
  27. insert into chengji (id, name, course, score)
  28. values (3, '王五', '历史', 45);
  29. insert into chengji (id, name, course, score)
  30. values (3, '王五', '化学', 21);
  31. insert into chengji (id, name, course, score)
  32. values (4, 'Jack', '语文', 86);
  33. insert into chengji (id, name, course, score)
  34. values (4, 'Jack', '数学', 90);
  35. insert into chengji (id, name, course, score)
  36. values (4, 'Jack', '英语', 93);
  37. insert into chengji (id, name, course, score)
  38. values (4, 'Jack', '历史', 77);
  39. insert into chengji (id, name, course, score)
  40. values (4, 'Jack', '化学', 33);
  41. insert into chengji (id, name, course, score)
  42. values (5, 'Helen', '语文', 89);
  43. insert into chengji (id, name, course, score)
  44. values (5, 'Helen', '数学', 97);
  45. insert into chengji (id, name, course, score)
  46. values (5, 'Helen', '英语', 95);
  47. insert into chengji (id, name, course, score)
  48. values (5, 'Helen', '历史', 73);
  49. insert into chengji (id, name, course, score)
  50. values (5, 'Helen', '化学', 29);
  51. commit;

看一下表结果

1.dedode函数

decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)
这个是decode的表达式,具体的含义解释为:

  1. IF 条件=值1 THEN
  2.     RETURN(翻译值1)
  3. ELSIF 条件=值2 THEN
  4.     RETURN(翻译值2)
  5.     ......
  6. ELSIF 条件=值n THEN
  7.     RETURN(翻译值n)
  8. ELSE
  9.     RETURN(缺省值)
  10. END IF
  1. SELECT id,name,
  2. sum(decode(course,'语文',score,0)) 语文,
  3. sum(decode(course,'数学',score,0)) 数学,
  4. sum(decode(course,'英语',score,0)) 英语,
  5. sum(decode(course,'历史',score,0)) 历史,
  6. sum(decode(course,'化学',score,0)) 化学,
  7. sum(score) 总成绩
  8. from chengji
  9. GROUP BY id,name
  10. ORDER BY id;

2.case when

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

  1. SELECT id,name,
  2. max(case when course='语文' then score else 0 end) 语文,
  3. max(case when course='数学' then score else 0 end) 数学,
  4. max(case when course='英语' then score else 0 end) 英语,
  5. max(case when course='化学' then score else 0 end) 化学,
  6. max(case when course='历史' then score else 0 end) 历史,
  7. sum(score) 总成绩
  8. from chengji
  9. GROUP BY id,name
  10. ORDER BY id;

3.pivot

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

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
oracle 经典分数排名
列转行,行转列
MySQL经典练习题及答案,常用SQL语句练习50题
Oracle行转列与列转行
mysql-聚合函数
oracle基本建表语句
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服