将行转换为更多列
Posted
技术标签:
【中文标题】将行转换为更多列【英文标题】:Converting rows into more columns 【发布时间】:2020-01-24 05:54:48 【问题描述】:我有一个有 4 列的表格 ID
,ROL_NUM
,NAME
,DEPT
并记录如下:
ID ROL_NUM NAME DEPT
1 1 Rajasekar CSE
1 1 Bala CSE
1 1 Poo IT
1 1 bhasker CSE
我需要这个表的输出如下
ID ROL_NUM NAME DEPT NAME DEPT NAME DEPT NAME DEPT
1 1 Rajasekar CSE Bala CSE Poo It bhasker CSE
有人提供建议或通过提供查询来帮助我。
【问题讨论】:
【参考方案1】:您可以使用条件聚合进行此类旋转:
select ID, rol_num, max( case when rn = 1 then name end ) as name1,
max( case when rn = 1 then dept end ) as dept1,
max( case when rn = 2 then name end ) as name2,
max( case when rn = 2 then dept end ) as dept2,
max( case when rn = 3 then name end ) as name3,
max( case when rn = 3 then dept end ) as dept3,
max( case when rn = 4 then name end ) as name4,
max( case when rn = 4 then dept end ) as dept4
from
(
select t.*, row_number() over (order by t.name) as rn
from tab t
order by t.name
)
group by ID, rol_num
Demo
【讨论】:
100 行怎么样? 您的解决方案替代方案@AnkitBajpai 怎么样? 我试图使用最多 10 列的枢轴来做到这一点,但只是卡住了双列枢轴。 您可以在 SQL Server 中进行动态旋转,但在 Oracle 的 SQL @AnkitBajpai 中没有这种直接的方法 嗯,正确。甚至我现在也认为这是实现预期结果的最佳方法之一。【参考方案2】:SELECT
ID,
ROL_NUM,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 1) NAME,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 2) DEPT,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 3) NAME,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 4) DEPT,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 5) NAME,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 6) DEPT,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 7) NAME,
REGEXP_SUBSTR(NAMEDEPT, '[^,]+', 1, 8) DEPT
from (SELECT ID
,ROL_NUM
,LISTAGG(NAME || ',' ||DEPT,',') WITHIN GROUP (ORDER BY ID) AS NAMEDEPT
FROM TABLE1
GROUP BY ID,ROL_NUM);
输出
ID ROL_NUM NAME DEPT NAME DEPT NAME DEPT NAME DEPT
1 1 Bala CSE Poo IT Rajasekar CSE bhasker CSE
演示:
http://sqlfiddle.com/#!4/beb53/19
【讨论】:
【参考方案3】:以下查询可能会对您有所帮助。
select
id,
rol_num,
substr(SYS_CONNECT_BY_PATH(name, ','),2) name_list
from
(
select
id,
rol_num,
name,
count(*) OVER ( partition by id) cnt,
ROW_NUMBER () OVER ( partition by id order by name) seq
from test where id is not null)
where
seq=cnt
start with
seq=1
connect by prior
seq+1=seq
and prior id=id;
输出
ID ROL_NUM NAME_LIST
1 1 Bala,Rajasekar
同样,您可以添加 dept_list。
【讨论】:
这肯定不是预期的答案。 显示名称和部门列中的所有行将不是可行的解决方案,因为可能有数千行。因此,在单列中以逗号分隔列表显示名称可能会有所帮助,然后可以根据需要将它们隔离。 但这不是 OP 的要求。 我提供了替代解决方案,因为我在 oracle 中找不到任何方法。以上是关于将行转换为更多列的主要内容,如果未能解决你的问题,请参考以下文章