现有数据表如下:
组名称 值 排序
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);
------解决方案--------------------
列数无法固定的时候,通过过程,动态获得列数,拼接行转列。
具体方法楼上的已经给了。