Oracle 10G:如何将多个列值转换为行

时间:2015-02-09 05:58:08

标签: sql oracle oracle10g

我有这样的表。

Sname   SUB1    SUB2    SUB3    MAR1    MAR2    MAR3
----------------------------------------------------
S001    HIN     ENG     ART     50      80      90
S002    ENG     ART     HIN     20      60      20

现在我需要以下格式的上述结果:

Sname       SUB     MARKS   
-----------------------------
S001        HIN     50
S001        ENG     80
S001        ART     90
S002        HIN     20
S002        ENG     20
S002        ART     60

如何转换此内容?

2 个答案:

答案 0 :(得分:1)

如果您使用的是11g或更高版本,则可以使用UNPIVOT,这对此很容易。

当您使用10g时,另一种方法是为主表中的每一行生成三行:

select t.sname
     , case dummy.no
          when 1 then sub1
          when 2 then sub2
          when 3 then sub3
       end as sub
     , case dummy.no
          when 1 then mar1
          when 2 then mar2
          when 3 then mar3
       end as marks
from mytable t
cross join (
   select level no
   from dual
   connect by level <= 3
) dummy

dummy将包含三行。 cross join然后使mytable中每行的结果有三行,而这三行的值为dummy.no 1,2和3。

然后在case语句中,您可以选择mytable中要在第一行,第二行和第三行中使用哪些值。

答案 1 :(得分:0)

您必须对表进行三次查询并将结果粘合在一起:

select sname, sub1 as sub, mar1 as marks from mytable
union all
select sname, sub2 as sub, mar2 as marks from mytable
union all
select sname, sub3 as sub, mar3 as marks from mytable;