oracle 列行转换问题

来源:百度知道 编辑:UC知道 时间:2024/05/30 00:52:02
有一个表
PID INAME CONTENT
--- ----- -------
1 item01 1-1
2 item01 2-1
3 item01 3-1
4 item01 4-1
5 item01 5-1
6 item01 6-1
7 item01 7-1
8 item01 8-1

1 item02 1-2
2 item02 2-2
3 item02 3-2
4 item02 4-2
5 item02 5-2
6 item02 6-2
7 item02 7-2
8 item02 8-2

1 item03 1-3
2 item03 2-3
3 item03 3-3
4 item03 4-3
5 item03 5-3
6 item03 6-3
7 item03 7-3
8 item03 8-3
。。。。。
要让他显示成
PID item01 item02 item03 。。。。
1 1-1 1-2 1-3
2 2-1 2-2 2-3
3 3-1 3-2 3-3
4 4-1 4-2 4-3
5 5-1 5-2 5-3
6 6-1 6-2 6-3
7 7-1 7-2 7-3
8 8-1 8-2 8-3

怎么写sql,注意content字段是varchar2类型,列的数量不固定。怎么写?
能给出方案的,我给追加20-100分
行也是动态的,其实这是一个中间表

使用scott.emp表的例子:
select deptno,
max(decode(r, 1, ename, '')) CLERK,
max(decode(r, 2, ename, '')) MANAGER
from (select ename,
deptno,
dense_rank() over(partition by deptno order by job) as r
from scott.emp
where empno in (7782, 7934, 7876, 7566)) a
group by deptno

如果行也是动态的,需要用外连接,保证每行都有数据

select PID ,item01=
(case INAME when 'item01' then CONTENT) ,
item02 =(case INAME when 'item02' then CONTENT),
item03 =(case INAME when 'item03' then CONTENT)
from table

Oracel , DB2, SQL 解决
1、
select pid, iname, content, row_number() over(partition by iname by pid) rn from table

2、
select rn,
case iname when iname='item01' else null end as item01,
case iname when iname='item02' else null end as item02,
case iname when iname=