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