动态多行转一列,没想明白咋做
TABLE1
ID COL VAL
1 11 111
1 22 222
1 33 333
...转换后
ID COl11 COL22 COL3 ...
1 111 222 333由于行数不定的,所以没明白咋做
用存储过程也不是很好做
TABLE1
ID COL VAL
1 11 111
1 22 222
1 33 333
...转换后
ID COl11 COL22 COL3 ...
1 111 222 333由于行数不定的,所以没明白咋做
用存储过程也不是很好做
解决方案 »
- Linux环境下关机再开机后Oracle没有listener的问题。
- SQL语句如何查询分区键
- 请问如何修改oracle10g中的db_block_size的大小?
- oracle数据库远程连接
- 如何自动生成数据?
- 请教一个日志的问题!
- 用OO4O调用ORACLE的存储过程,错在哪里???
- 比较两个日期相差几天?
- 为什么以ORACLE为后台,使用BDE SQL_LINK连接Oracle使用类似Query->ParamByName("p1")->AsString="aa"来传递SQL语句参数会查询不出结果。
- Oracle11g的数据泵问题
- 新手求救:oracle 9i怎样实现数据库的连接
- 请教一个sql(oracle)查询的问题
http://topic.csdn.net/u/20100109/13/6a10c168-f190-4766-b838-adbf03c4ac7b.html?92131
或者看看这个帖子:
http://topic.csdn.net/u/20110214/14/272200ac-c631-4a2c-b980-6e1404907d4d.html
如果不用正则,就得先把行数的最大值查出来,根据level处理,不知道可行不可行
还有 col11 col22这样的方式估计没法实现
--关键是要去尝试:有思路就好
--再写一次:Connected to:
Oracle Database 10g Release 10.1.0.2.0 - ProductionSQL> set serveroutput on
SQL> set linesize 30000
SQL> select * from tab;ID COL VAL
---------- ---------- ----------
1 11 111
1 22 222
1 33 333SQL> edit
Wrote file afiedt.buf 1 create or replace procedure row_to_col_func2(cur out sys_refcursor)
2 as
3 sqlstr varchar2(2000):='select id';
4 begin
5 for rs in (select distinct col from tab ) loop
6 sqlstr:=sqlstr||chr(10)||','||'max(decode(col,'''||rs.col||''',val,'''')) '||'col'||rs.col;
7 end loop ;
8 sqlstr:=sqlstr||chr(10)||'from tab group by id ' ;
9 open cur for sqlstr;
10* end row_to_col_func2;
SQL> /Procedure created.SQL> var cur refcursor
SQL> exec row_to_col_func2(:cur);PL/SQL procedure successfully completed.SQL> print curID COL11 COL22 COL33
---------- ---------- ---------- ----------
1 111 222 333SQL> INSERT INTO tab VALUES('1','44','555');1 row created.SQL> INSERT INTO tab VALUES('1','55','555');1 row created.SQL> INSERT INTO tab VALUES('1','66','666');1 row created.SQL> commit;Commit complete.SQL> exec row_to_col_func2(:cur);PL/SQL procedure successfully completed.SQL> print curID COL11 COL22 COL33 COL44 COL55 COL66
---------- ---------- ---------- ---------- ---------- ---------- ----------
1 111 222 333 555 555 666SQL>
tabname 需要进行行转列操作的表名;
group_col 查询结果要按某列或某些列分组的字段名;
column_col 要从行转成列的字段;
value_col 需要聚合的值字段;
Aggregate_func 选用的聚合函数,可选,默认为max;
where_value where子句,对满足条件的行做转换
colorder 行转列后列的排序,可选;
roworder 行转列后记录的排序,可选;
when_value_null 若value_col字段的值聚合后为空,则转换成该值,可选;
viewname 创建的视图名称,可选,默认为v_tmp。
http://blog.csdn.net/leisore/archive/2011/02/15/6186827.aspx