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

Oracle 10G : How to convert multiple column values into rows

我有这样的关注 table。

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

如何转换?

您必须查询 table 三次并将结果粘合在一起:

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;

如果你有 11g 或更高版本,你可以使用 UNPIVOT 这会很容易。

由于您使用的是 10g,另一种方法是为主 table 中的每一行生成三行:

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 中选择要在第一行、第二行和第三行中使用的值。