【问题标题】:Convert horizontal table to vertical in oracle在oracle中将水平表转换为垂直表
【发布时间】:2017-08-07 03:44:12
【问题描述】:

我的表格格式如下:

 ID | Key | Value
 --   ---   -----
 1     A     aa    
 2     B     bb
 3     A     ay
 4     C     cc
 5     B     bx
 6     C     ct 

我需要将此表转换为以下格式:

输出:

 A    B    C
---  ---  ---
aa   bb   cc
ay   bx   ct

我在 oracle 11g 中寻找 PIVOT 函数,但输入表中的“键”值不是一组固定的值,它们可以是任何值。 我还寻找其他此类问题,但我不确定应该如何编写查询。

任何帮助将不胜感激,谢谢!

已编辑:

对于解决方案,我想执行以下查询,但它在 IN 子句的子查询中给出错误。我不明白为什么会这样。

Select * from (Select Key, Value, Id from tableName
pivot (max(Value) for Key IN (SELECT distinct Key from tableName)));

谢谢!

【问题讨论】:

    标签: sql oracle oracle11g pivot


    【解决方案1】:

    您可以如下应用数据透视函数。

       select * from
        (select Key,Value from yourtable) 
        pivot(max(Value) for Key in ('A', 'B', 'C'));
    

    pivot 中的子查询仅与 XML 关键字结合使用

    进行如下查询:

    Select * from (Select Key, Value, Id from tableName)
    pivot xml (max(Value) for Key IN (SELECT distinct Key from tableName));
    

    【讨论】:

    • 感谢@Tom,但按照您的建议制作括号并没有解决问题。我不知道为什么我找不到这样的带有子查询的 Pivot 示例。
    • 我认为你必须使用pivot xml 来使用子查询。您将获得 xml 格式的输出。
    • 嗯,但是我需要不带 xml 标签的表格形式的输出,所以我宁愿先执行子查询并在 Pivot 查询中使用它的结果。谢谢!
    • @OutOfMind 我见过这样的问题,用于将 xml 转换为 SO 中的表格形式。但我认为他们使用光标或 procs 或类似的东西。更好的是,您可以为此提出一个新问题。即使我很想知道答案:)
    • 嘿@Tom,为它发布了一个问题:stackoverflow.com/questions/42851887/…
    【解决方案2】:

    您可以使用动态sql,因为您说密钥不固定 为键创建一个字符串,这将对您有所帮助。将此字符串传递给您的数据透视函数,因为键在字符串中,因此这将对您有所帮助。

    【讨论】:

    • 谢谢@Rohit,我编辑了这个问题,请看一下。 Pivot 函数是否允许这样的子查询?或者我必须按照您的建议使用 Dynamic Sql?
    • 我认为子查询对您没有帮助,请访问链接以了解数据透视表中的动态查询将如何帮助您。 stackoverflow.com/questions/13245364/…
    • @RohitGupta 您添加的链接是 foe Sql Server。问题是oracle
    • 先生,这个问题也有 sql server 的标签,该链接也将有助于如何在 oracle 中实现这一点。
    猜你喜欢
    • 2018-12-31
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多