我有以下名为_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一样多的列(没有很多)
  • 在运行查询之前,无法知道可能存在哪些列。
  • 我试图避免运行初始查询以编程方式构建最终查询。
  • 空白单元格可以为null或空字符串,并不重要。
  • 我正在使用Oracle 10g,但也可以使用11g解决方案。

  • 当您知道您的透视列可以被调用时,这里有很多示例,但是我只是找不到适用于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:更改了vpivot语句中的pivot xmlmax(v),因为它应该按照注释之一所述进行汇总。我还添加了in子句,该子句对于pivot不是可选的。当然,必须在in子句中指定值会破坏实现完全动态的数据透视表/交叉表查询的目的,这与该问题的发布者所希望的一样。

    关于sql - 在Oracle中将行动态转换为列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7730111/

    10-16 17:21