如何通过sql实现行转列???

hkstudio 2008-03-11 11:48:24
如何通过sql实现行转列???


create table t2(col1 varchar2(10),col2 varchar2(10));
insert into t2 values('001','vl1');
insert into t2 values('001','vl2');
insert into t2 values('001','vl3');
insert into t2 values('002','vl1');
insert into t2 values('002','vl2');

实现如下表结构:

col1 col2 col3 col4
---- ----- ----- ------
001 vl1 vl2 vl3
002 vl1 vl2


001有N行,相应的也可以转成N列,

请高手指点。
...全文
305 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
UltraBejing 2008-04-30
  • 打赏
  • 举报
回复
都是很好的建议! 值得学习
hrui99 2008-03-20
  • 打赏
  • 举报
回复
SQL语句语句中调用存储过程。方式比较好。
DragonBill 2008-03-14
  • 打赏
  • 举报
回复
动态列只能用SP解决
hkstudio 2008-03-12
  • 打赏
  • 举报
回复
从网上找的,但是不符合我的需求。请高手指点:
以下是网上转载的

方法一:
create table t2(col1 varchar2(10),col2 varchar2(10));
insert into t2 values('001','vl1');
insert into t2 values('001','vl2');
insert into t2 values('001','vl3');
insert into t2 values('002','vl1');
insert into t2 values('002','vl2');

SELECT COL1, LTRIM(MAX(SYS_CONNECT_BY_PATH(COL2, ' ')), ',') COL2
FROM (SELECT COL1,
COL2,
MIN(COL2) OVER(PARTITION BY COL1) COL2_MIN,
(ROW_NUMBER() OVER(ORDER BY COL1, COL2)) +
(DENSE_RANK() OVER(ORDER BY COL1)) NUMID
FROM T2)
START WITH COL2 = COL2_MIN
CONNECT BY NUMID - 1 = PRIOR NUMID
GROUP BY COL1;COL1 COL2
---------- ----------------------------------------
001 vl1,vl2,vl3
002 vl1,vl2
hebo2005 2008-03-12
  • 打赏
  • 举报
回复
如果是固定列数,可以用DECODE实现,如果是不固定列,用存储过程,搜索下吧,这个问题被提了太多次了,基本上隔几天就会出现一次
hongbinchen 2008-03-12
  • 打赏
  • 举报
回复
select col1,col2,col3,col4... from (
select col1,col2,
lead(col2,1) over (order by col1,col2) col3 ,
lead(col1,1) over (order by col1,col2) col3_1 ,
lead(col2,2) over (order by col1,col2) col4,
lead(col1,2,col1) over (order by col1,col2) col4_1
......
from t2
) t where col1=col3_1 and col1=col4_1 ... ;
根据你N的情况,再添加几列就可以,如果N是不确定的,只能动态去拼sql,,没有万能的!

3,490

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧