Oracle中的wmsys.wm_concat
2014-04-21 15:21
357 查看
Oracle中的wmsys.wm_concat主要实现行转列功能(说白了就是将查询的某一列值使用逗号进行隔开拼接,成为一条数据)。wmsys.wm_concat除了单独使用外还可以和over函数结合使用。开始看看具体使用方法:select t.rank, t.Name from t_menu_item t;rank Name10 CLARK10 KING10 MILLER20 ADAMS20 FORD20 JONES20 SCOTT20 SMITH30 ALLEN30 BLAKE30 JAMES30 MARTIN30 TURNER30 WARD上边的查询语句返回的结果可以清晰看到rank存在重复的,一个相同的rank对应多个Name,如果我们想把某一个Rank的所有Name以","隔开,怎么做的,当然可以自定义函数,别急,Oracle 10g开始提供了这个wmsys.wm_concat,它可以帮助我们把行的值以逗号隔开,看看怎么来实现.一。直接使用wmsys.wm_concat
select t.rank, WMSYS.WM_CONCAT(t.Name) TIME From t_menu_item t GROUP BY t.rank;通过Group by进行分组,查询每类Rank对应的Name的值,看看查询的结果.10 CLARK, KING, MILLER20 ADAMS, FORD, JONES, SCOTT, SMITH30 ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD是不是很神奇,rank已经分类,并且他的Name已经用逗号进行隔开。二.wmsys.wm_concat和over的结合使用
over函数: over函数指定了分析函数工作的数据窗口的大小,这个数据窗口大小可能会随着行的变化而变化。
例如:
over(order by salary)按照salary排序进行累计,order by是个默认的开窗函数;
over(partition by deptno) 按照部门分区;
over(order by salary range between 50 preceding and 150 following)每行对应的数据窗口是之前行幅度值不超过50,之后行幅度值不超过150的数据记录 ;
over(order by salary rows between 50 perceding and 150 following)前50行,后150行;
over(order by salary rows between unbounded preceding and unbounded following)所有行 ;
over(order by salary range between unbounded preceding and unbounded following)所有行。
看看wmsys.wm_concathe和over的结合例子:
select id,wmsys.wm_concat(name) over (order by id,name) name from idtable;
根据id,name进行排序累计,看看输出的结果.
id name
10 ab 10 ab,bc 10 ab,bc,cd 20 ab,bc,cd,hi 20 ab,bc,cd,hi,ij 20 ab,bc,cd,hi,ij,mnke
可以清晰的看到id为10的name列的值是从ab依次叠加到最后ab,bc,cd(当然这几个值肯定是id为10对应的值),id为20的name列的值是从ab,bc,cd,hi(之所以不是从ab开始是因为当前order by的
还有name列,所以需要继续向下进行)一直到ab,bc,cd,hi,ij,mnke.
select id,wmsys.wm_concat(name) over (partition by id) name from idtable;
这个例子仅仅是根据id进行排序(over (order by ename)如果没有order by 子句,求和就不是“连续”的,这个就是和上个实例的最大区别,没有连续)。
ID NAME 10 ab,bc,cd 10 ab,bc,cd 10 ab,bc,cd 20 hi,ij,mn 20 hi,ij,mn 20 hi,ij,mn 可以看到仅仅是根据id进行排序的查询。
select id,wmsys.wm_concat(name) over (partition by id,name) name from idtable;
ID NAME 10 ab 10 bc 10 cd 20 hi 20 ij 20 mn
可以看到,这里和上个实例的区别在于Name列没有叠加,因为在over 中加入了name
例子:
select * from t2
id name
10 ab
10 bc
10 cd
20 hi
20 ij
20 nm
----------------------------------------------------------------------
select id,wmsys.wm_concat(name) name from t2 group by id;
110 ab,bc,cd
2 20 hi,ij,nm
-----------------------------------------------------------------------
select id,wmsys.wm_concat(name) over (order by id ) name from t2;
110 ab,bc,cd
210 ab,bc,cd
310 ab,bc,cd
4 20 ab,bc,cd,hi,ij,nm
5 20 ab,bc,cd,hi,ij,nm
6 20 ab,bc,cd,hi,ij,nm
--------------------------------------------------------------------------------
select id,wmsys.wm_concat(name) over (order by id,name ) name from t2;
110 ab
210 ab,bc
310 ab,bc,cd
4 20 ab,bc,cd,hi
5 20 ab,bc,cd,hi,ij
6 20 ab,bc,cd,hi,ij,nm
---------------------------------------------------------------------------------
select id,wmsys.wm_concat(name) over (partition by id) name from t2;
110 ab,bc,cd
210 ab,bc,cd
310 ab,bc,cd
4 20 hi,ij,nm
5 20 hi,ij,nm
6 20 hi,ij,nm
-----------------------------------------------------------------------------------------
select id,wmsys.wm_concat(name) over (partition by id,name) name from t2;
110 ab
2 10 bc
310 cd
4 20 hi
5 20 ij
6 20 nm
--------------------------------------------------------------------------------------------
相关文章推荐
- Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)
- 关于oracle中的wmsys.wm_concat中的使用问题
- oracle 函数WMSYS.WM_CONCAT()的用法
- 关于ORACLE wmsys.wm_concat 行转列函数使用
- Oracle wmsys.wm_concat()函数 顺序问题 分隔符问题
- oracle查询结果中wmsys.wm_concat组合一列多行结果,以及每行中某些列的组合结果
- Oracle中的wmsys.wm_concat
- oracle wmsys.wm_concat用法
- oracle wmsys.wm_concat 函数用法
- oracle 函数 WMSYS.WM_CONCAT 的用法 与 mysql 函数GROUP_CONCAT的用法
- oracle wmsys.wm_concat() 多行传为一行
- Oracle中的wmsys.wm_concat
- oracle函数介绍(1)――WMSYS.WM_CONCAT行转列
- oracle中的wmsys.wm_concat()函数
- oracle 函数WMSYS.WM_CONCAT()的用法(让查询结果行转列)
- oracle 函数WMSYS.WM_CONCAT()的用法(行转列)
- Oracle: wmsys.wm_concat、sys_connect_by_path、自定义函数实现行列转换
- Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)
- 初学Oracle UNPIVOT,PIVOT,WMSYS.WM_CONCAT三个函数
- oracle内置函数 wmsys.wm_concat使用