怎样将oracle中的列变成行

id name Course1 a 数学1 a 语文 变成如下id name Course1 Course21 a 数学 语文
2024-11-19 14:45:09
推荐回答(3个)
回答1:

  固定列数的行列转换如
  student subject grade
---------------------------
  student1 语文 80
  student1 数学 70
  student1 英语 60
  student2 语文 90
  student2 数学 80
  student2 英语 100
  转换为
  语文 数学 英语
  student1 80 70 60
  student2 90 80 100
  语句如下:
  select student,sum(decode(subject,'语文', grade,null)) "语文",
  sum(decode(subject,'数学', grade,null)) "数学",
  sum(decode(subject,'英语', grade,null)) "英语"
  from table
  group by student
  2、不定列行列转换如
  c1 c2
--------------
1 我
  1 是
  1 谁
  2 知
  2 道
  3 不
......
转换为
  1 我是谁
  2 知道
  3 不
  这一类型的转换必须借助于PL/SQL来完成,这里给一个例子
  CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER)
  RETURN VARCHAR2
  IS
  --用于返回值
  Col_c2 VARCHAR2(4000);
  BEGIN
  FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP
  Col_c2 := Col_c2||cur.c2;
  END LOOP;
  Col_c2 := rtrim(Col_c2,1);
  RETURN Col_c2;
  &

回答2:

1、固定列数的行列转换如
student subject grade
---------------------------
student1 语文 80
student1 数学 70
student1 英语 60
student2 语文 90
student2 数学 80
student2 英语 100
转换为
语文 数学 英语
student1 80 70 60
student2 90 80 100
语句如下:
select student,sum(decode(subject,'语文', grade,null)) "语文",
sum(decode(subject,'数学', grade,null)) "数学",
sum(decode(subject,'英语', grade,null)) "英语"
from table
group by student
2、不定列行列转换如
c1 c2
--------------
1 我
1 是
1 谁
2 知
2 道
3 不
......
转换为
1 我是谁
2 知道
3 不
这一类型的转换必须借助于PL/SQL来完成,这里给一个例子
CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER)
RETURN VARCHAR2
IS
--用于返回值
Col_c2 VARCHAR2(4000);
BEGIN
FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP
Col_c2 := Col_c2||cur.c2;
END LOOP;
Col_c2 := rtrim(Col_c2,1);
RETURN Col_c2;
&

回答3:

--oracle 11g版本:
with tmp(id,
name,
Course) as
 (select 1, 'a', '数学' from dual union all select 1, 'a', '语文' from dual)
select *
  from tmp pivot(max(Course) for Course in('数学' as Course1,
                                           '语文' as Course2));
--oracle 11g以下版本:
with tmp(id,
name,
Course) as
 (select 1, 'a', '数学' from dual union all select 1, 'a', '语文' from dual)
select id,
       name,
       max(decode(Course, '数学', Course, null)) as Course1,
       max(decode(Course, '语文', Course, null)) as Course2
  from tmp
  group by id,name

如果要动态的话,只能用PL/SQL去实现了