【问题标题】:Column to ROW IN ORACLE SQL [duplicate]ORACLE SQL中的列到行[重复]
【发布时间】:2021-10-27 07:45:25
【问题描述】:

请为以下请求分享一些 SQL 答案:

我想将单列表中的所有行作为单行返回,每一行的值都转为输出中的一列。

SAMPLE_COLUMN_DATA
------------------
    SAM ANDREW
    JOHN MATHEW
    CHRIS JOE
    JANE PATRICK

需要的输出如下:

col1       |col2        |col3      |col4
------------------------------------------------
SAM ANDREW |JOHN MATHEW |CHRIS JOE |JANE PATRICK        

【问题讨论】:

    标签: sql oracle pivot


    【解决方案1】:

    我理解问题的方式是聚合listagg,以竖线字符作为分隔符):

    SQL> with test (sample_column_data) as
      2    (select 'SAM ANDREW'   from dual union all
      3     select 'JOHN MATHEW'  from dual union all
      4     select 'CHRIS JOE'    from dual union all
      5     select 'JANE PATRICK' from dual
      6    )
      7  select listagg(sample_column_data, '|') within group (order by null) result
      8  from test;
    
    RESULT
    --------------------------------------------------------------------------------
    CHRIS JOE|JANE PATRICK|JOHN MATHEW|SAM ANDREW
    
    SQL>
    

    如果它们必须是“真实”的单独列,那么您可以使用 ROWNUM 和聚合以及 CASE。当然,这根本无法扩展。

    SQL> with test (sample_column_data) as
      2    (select 'SAM ANDREW'   from dual union all
      3     select 'JOHN MATHEW'  from dual union all
      4     select 'CHRIS JOE'    from dual union all
      5     select 'JANE PATRICK' from dual
      6    )
      7  select
      8    max(case when rownum = 1 then sample_column_data end) col1,
      9    max(case when rownum = 2 then sample_column_data end) col2,
     10    max(case when rownum = 3 then sample_column_data end) col3,
     11    max(case when rownum = 4 then sample_column_data end) col4
     12  from test;
    
    COL1         COL2         COL3       COL4
    ------------ ------------ ---------- ------------
    SAM ANDREW   JOHN MATHEW  CHRIS JOE  JANE PATRICK
    
    SQL>
    

    【讨论】:

    • 我已经使用这个管道符号来区分列。这不是我所期望的结果。我需要的是,如果你选择一个表,你如何查看该表中的列。 ..以同样的方式,我希望将这些值视为单独的列。如果您需要更多详细信息,请告诉我。
    • 我编辑了答案并添加了另一个示例;看看吧。
    • 谢谢@Littlefoot ..
    • 不客气。
    【解决方案2】:

    在您的问题中,您有一列包含值(名称)..

    在这种情况下,你可以使用listagg()函数:

    select 
            listagg(SAMPLE_COLUMN_DATA,'|') within group 
             (order by SAMPLE_COLUMN_DATA) 
    from dual;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 2012-12-18
      • 2015-10-02
      • 2021-10-20
      相关资源
      最近更新 更多