我有以下名为_kv的Oracle 10g表:
select * from _kv
ID K V
---- ----- -----
1 name Bob
1 age 30
1 gender male
2 name Susan
2 status married
我想使用普通SQL(而不是PL / SQL)将键转换为列,以便生成的表如下所示:
ID NAME AGE GENDER STATUS
---- ----- ----- ------ --------
1 Bob 30 male
2 Susan married
K
一样多的列(没有很多)当您知道您的透视列可以被调用时,这里有很多示例,但是我只是找不到适用于Oracle的通用透视解决方案。
谢谢!
最佳答案
Oracle 11g提供了您想要的PIVOT
操作。
Oracle 11g解决方案
select * from
(select id, k, v from _kv)
pivot(max(v) for k in ('name', 'age', 'gender', 'status')
(注意:我没有11g的副本可以对此进行测试,因此我尚未验证其功能)
我从以下位置获得了此解决方案:http://orafaq.com/wiki/PIVOT
编辑-枢轴xml选项(也是Oracle 11g)
显然,当您不知道可能需要的所有可能的列标题时,还有一个
pivot xml
选项。 (请参阅位于http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html页面底部附近的 XML TYPE 部分)select * from
(select id, k, v from _kv)
pivot xml (max(v)
for k in (any) )
(注意:和以前一样,我没有11g的副本可用于测试此功能,因此我尚未验证其功能)
编辑2:更改了
v
和pivot
语句中的pivot xml
为max(v)
,因为它应该按照注释之一所述进行汇总。我还添加了in
子句,该子句对于pivot
不是可选的。当然,必须在in
子句中指定值会破坏实现完全动态的数据透视表/交叉表查询的目的,这与该问题的发布者所希望的一样。关于sql - 在Oracle中将行动态转换为列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7730111/