360图书馆文章备份

← 返回首页

Oracle中的行列转换

2020-01-11
  • 首先建一个表
  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;