我有这样的表。
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
如何转换此内容?
答案 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;