【问题标题】:Rotate/Generate table in Oracle [duplicate]在 Oracle 中旋转/生成表 [重复]
【发布时间】:2014-05-15 04:54:15
【问题描述】:

我对 Oracle 很陌生。我想从原始表生成另一个表。这是我的原始表格。

Function | Machine | Value
============================
    A    |   M1    | VALID
    A    |   M2    | INVALID
    B    |   M1    | VALID
    B    |   M2    | INVALID
    C    |   M1    | INVALID
    C    |   M2    | VALID

这是我要生成的结果表。

Function |   M1    |   M2
============================
    A    |  VALID  | INVALID
    B    |  VALID  | INVALID
    C    | INVALID | VALID

这可能吗?我很感激任何建议。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    使用pivot

    select * from 
    table1
    pivot
    (
       max("Value")
      for "Machine" in ('M1', 'M2')
          )
    

    fiddle

    【讨论】:

      【解决方案2】:

      如果您使用的是较低版本的 oracle 10,其中不支持数据透视函数,以下查询将对您有所帮助:

      with tab as
      (
        SELECT 'A' FUNCTION, 'M1' MACHINE, 'VALID' VALUE FROM DUAL
        UNION 
        SELECT 'A' FUNCTION, 'M2' MACHINE, 'INVALID' VALUE FROM DUAL
        UNION
        SELECT 'B' FUNCTION, 'M1' MACHINE, 'VALID' VALUE FROM DUAL
        UNION 
        SELECT 'B' FUNCTION, 'M2' MACHINE, 'INVALID' VALUE FROM DUAL
        UNION
        SELECT 'C' FUNCTION, 'M1' MACHINE, 'INVALID' VALUE FROM DUAL
        UNION 
        SELECT 'C' FUNCTION, 'M2' MACHINE, 'VALID' VALUE FROM DUAL
      )
      SELECT FUNCTION, 
        max(case when MACHINE = 'M1' THEN VALUE ELSE ' ' END) M1,
        max(case when MACHINE = 'M2' THEN VALUE ELSE ' ' END) M2
      FROM tab
      group by FUNCTION
      order by FUNCTION;
      

      【讨论】:

        【解决方案3】:

        基本上您需要对数据进行透视,如果您使用的是 Oracle 11g,则可以使用透视函数,否则您可以使用本文中给出的 Case 或 Decode 函数Oracle Pivot

        例子:

        pivot 
        (
           count(field_name)
           for field_name in ('value1','value2','value3'...)
        )
        

        希望对你有帮助

        【讨论】:

        • 任何机会,如果有人能告诉我为什么我的回答被否决了吗?
        猜你喜欢
        • 1970-01-01
        • 2012-10-15
        • 2016-02-23
        • 2016-09-26
        • 2022-09-30
        • 2014-12-17
        • 1970-01-01
        • 2015-01-03
        • 1970-01-01
        相关资源
        最近更新 更多