在 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>
如果它们必须是“真正的”独立列,那么您可以将 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>
在您的问题中,您有一列包含值(名称)..
在那种情况下,你可以使用listagg()
函数:
select
listagg(SAMPLE_COLUMN_DATA,'|') within group
(order by SAMPLE_COLUMN_DATA)
from dual;
请分享一些 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>
如果它们必须是“真正的”独立列,那么您可以将 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>
在您的问题中,您有一列包含值(名称)..
在那种情况下,你可以使用listagg()
函数:
select
listagg(SAMPLE_COLUMN_DATA,'|') within group
(order by SAMPLE_COLUMN_DATA)
from dual;