sql - 在Oracle中将行动态转换为列

标签 sql oracle oracle10g pivot

我有以下名为_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/

    相关文章:

    sql - Oracle SQL Developer 3.1.07 使用 listagg 的字符之间的额外空格

    null - 不是有一个开关来切换 Oracle 的空 varchar2 - null 行为吗?

    sql - 我想微调数据库上花费超过 3-5 小时的查询

    java - 如何唯一标识两个结果集是否相等?

    php - 更新大型 MySQL 表

    php - 附近的 SQL 语法错误

    oracle - 有什么方法可以对 Oracle 触发器进行逆向工程或对其进行反编译?

    sql - 在 SQL 查询中匹配部分日期?

    java - CHAR 类型的 JPA 查询。是 : JPA query with WHERE and EmbeddedId

    sql - 在我的例子中,如何将 varchar2 格式值转换为 Oracle 中的 datetime 类型?