oracle
来源:互联网 发布:便捷cpu使用软件 编辑:程序博客网 时间:2024/04/30 10:31
NOTE:特别声明一下内容转自网络
http://www.ningoo.net/html/2008/how_to_do_string_aggregate_on_oracle.html
假如有如下表,其中各个i值对应的行数是不定的
SQL> select * from t;
I A D
---------- ---------- -------------------
1 b 2008-03-27 10:55:42
1 a 2008-03-27 10:55:46
1 d 2008-03-27 10:55:30
2 z 2008-03-27 10:55:55
2 t 2008-03-27 10:55:59
--- 要获得如下结果,注意字符串需要按照D列的时间排序:
1 d,b,a
2 z,t
方法一:使用自定义函数
确定:遇到数据量大时,性能会非常差
create or replace function my_concat(n number)
return varchar2
is
type typ_cursor is ref cursor;
v_cursor typ_cursor;
v_temp varchar2(10);
v_result varchar2(4000):= '';
v_sql varchar2(200);
begin
v_sql := 'select a from t where i=' || n ||' order by d';
open v_cursor for v_sql;
loop
fetch v_cursor into v_temp;
exit when v_cursor%notfound;
v_result := v_result ||',' || v_temp;
end loop;
return substr(v_result,2);
end;
SQL> select i,my_concat(i) from t group by i;
I MY_CONCAT(I)
---------- --------------------
1 d,b,a
2 z,t
方法二:使用sys_connect_by_path
select i,ltrim(max(sys_connect_by_path(a,',')),',') a
from
(
select i,a,d,min(d) over(partition by i) d_min,
(row_number() over(order by i,d))+(dense_rank() over (order by i)) numid
from t
)
start with d=d_min connect by numid-1=prior numid
group by i;
方法三:使用wm_sys.wm_concat
SQL> select i,wmsys.wm_concat(a) from t group by i;
I WMSYS.WM_CONCAT(A)
---------- --------------------
1 b,a,d
2 z,t
SQL> select i,wmsys.wm_concat(a)
2 from
3 (select * from t order by i,d)
4 group by i;
I WMSYS.WM_CONCAT(A)
---------- --------------------
1 d,b,a
2 z,t
- Oracle???
- oracle
- oracle
- oracle
- oracle
- oracle...
- oracle
- oracle
- ORACLE
- Oracle
- ORACLE
- Oracle
- Oracle
- oracle
- oracle
- oracle
- ORACLE
- oracle
- 关于菜单操作的部分知识点
- 获取GridView中RowCommand的当前索引行
- 继续摘抄:角色访问控制(RBAC)
- 一个销售人员的感悟
- Lotus Notes 生成excel 報表
- oracle
- 面试68问经典回答
- 11
- 整理 firefox 和IE系列的相关差别,已备后用!
- ulimit值(Linux文件句柄数量)在Centos5(RHEL5)中的调整
- e1000e驱动阅读-开始的准备工作
- WINCE6.0下构建SilverLight程序的基本框架
- Oracle数据导入MySQL
- 关于Qt solution中qtwinmigrate framework的一个bug