oracle将行变成列如何实现?

时间:2021-12-28 10:32:45
我有一批ORACLE字段和数据如下:

姓名  科目  成绩
张三  语文  90
张三  数学  85
张三  英语  80
李四  语文  95
李四  数学  80
李四  英语  70


我要实现的结果是:
姓名  科目1  成绩1  科目2  成绩2  科目3  成绩3
张三  语文   90     数学   85     英语   80
李四  语文   95     数学   80     英语   70

请教一下高手,这样的做法用ORACLE如何实现?谢谢!

5 个解决方案

#2


with t as (
  select '张三' name,'语文' subject, 90 socre from dual union all
  select '张三' name,'数学' subject, 85 socre from dual union all
  select '张三' name,'英语' subject, 80 socre from dual union all
  select '李四' name,'语文' subject, 95 socre from dual union all
  select '李四' name,'数学' subject, 80 socre from dual union all
  select '李四' name,'英语' subject, 70 socre from dual)
SELECT NAME,
       MAX(decode(subject, '语文', subject)) 科目1,
       MAX(decode(subject, '语文', socre)) 成绩1,
       MAX(decode(subject, '数学', subject)) 科目2,
       MAX(decode(subject, '数学', socre)) 成绩2,
       MAX(decode(subject, '英语', subject)) 科目3,
       MAX(decode(subject, '英语', socre)) 成绩3
  FROM t
 GROUP BY NAME;

#3


引用 2 楼 tangren 的回复:
SQL code

with t as (
  select '张三' name,'语文' subject, 90 socre from dual union all
  select '张三' name,'数学' subject, 85 socre from dual union all
  select '张三' name,'英语' subject, 80 socre from du……


谢谢,你的结果出来是对的。
不过我有一个地方不太明白,为什么你前面加MAX(decode(subject, '英语', socre)) 成绩3
是MAX(),  我看有些地方用的是SUM()。我也尝试了下,用SUM会报错。

#4


看不懂谁能解释下。。

#5


非group by的字段要用聚合函数,sum的列必须是数字

#1


#2


with t as (
  select '张三' name,'语文' subject, 90 socre from dual union all
  select '张三' name,'数学' subject, 85 socre from dual union all
  select '张三' name,'英语' subject, 80 socre from dual union all
  select '李四' name,'语文' subject, 95 socre from dual union all
  select '李四' name,'数学' subject, 80 socre from dual union all
  select '李四' name,'英语' subject, 70 socre from dual)
SELECT NAME,
       MAX(decode(subject, '语文', subject)) 科目1,
       MAX(decode(subject, '语文', socre)) 成绩1,
       MAX(decode(subject, '数学', subject)) 科目2,
       MAX(decode(subject, '数学', socre)) 成绩2,
       MAX(decode(subject, '英语', subject)) 科目3,
       MAX(decode(subject, '英语', socre)) 成绩3
  FROM t
 GROUP BY NAME;

#3


引用 2 楼 tangren 的回复:
SQL code

with t as (
  select '张三' name,'语文' subject, 90 socre from dual union all
  select '张三' name,'数学' subject, 85 socre from dual union all
  select '张三' name,'英语' subject, 80 socre from du……


谢谢,你的结果出来是对的。
不过我有一个地方不太明白,为什么你前面加MAX(decode(subject, '英语', socre)) 成绩3
是MAX(),  我看有些地方用的是SUM()。我也尝试了下,用SUM会报错。

#4


看不懂谁能解释下。。

#5


非group by的字段要用聚合函数,sum的列必须是数字