在 ORACLE 中要行的列 SQL

Column to ROW IN ORACLE SQL

请分享一些 SQL 对以下要求的回答:

我想 return 单列 table 中的所有行作为单行,每行的值旋转到输出中的一列。

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

需要如下输出:

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

我理解这个问题的方式是聚合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>

如果它们必须是“真正的”独立列,那么您可以将 ROWNUMCASE 一起用于聚合。当然,这根本无法扩展。

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>

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

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

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