首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

列转换为行解决方法

2012-03-29 
列转换为行现有数据表如下:组名称值排序group1S1group1M2group1L3group21001group21102想实现查询结果如下

列转换为行
现有数据表如下:
组名称 值 排序
group1 S 1
group1 M 2
group1 L 3
group2 100 1
group2 110 2


想实现查询结果如下 :
组名称 列1 列2 列3 ....
group1 S M L
group2 100 110 (null)

数据表的记录是不固定的。比如group2会有 120,130等等。

我在网上找来一下,怎么都实现不了我要的效果, 求高手解答。立马给分

[解决办法]

SQL code
--建表create table Tmp_tt(组名称 varchar2(20),值 varchar2(10),排序 number);--插入数据insert into Tmp_ttselect 'group1','S',1 from dualunion allselect 'group1','M',2 from dualunion allselect 'group1','L',3 from dualunion allselect 'group2','100',1 from dualunion allselect 'group2','110',2 from dualunion allselect 'group2','120',3 from dualunion allselect 'group2','130',4 from dual;--创建存储过程create or replace procedure tmp_colToRow(  data_set out SYS_REFCURSOR)AS   v_sql varchar2(5000);   v_tt   varchar2(5000);begin     v_sql := 'SELECT 组名称';     for x in (select 排序 from Tmp_tt group by 排序 order by 排序)     loop         v_tt := v_tt || ',MAX(decode(排序,'||to_char(x.排序)||',值,NULL)) 列'||to_char(x.排序);     end loop;     v_sql := v_sql || v_tt ||' from Tmp_tt group by 组名称 order by 组名称';     --DBMS_OUTPUT.PUT_LINE(v_sql);     open data_set for v_sql;end;--执行存储过程exec tmp_colToRow(:v);
[解决办法]
列数无法固定的时候,通过过程,动态获得列数,拼接行转列。

具体方法楼上的已经给了。

热点排行