Oracle中的wmsys.wm_concat
2014-02-14 11:00
239 查看
Oracle中的wmsys.wm_concat主要实现行转列功能(说白了就是将查询的某一列值使用逗号进行隔开拼接,成为一条数据)。
wmsys.wm_concat除了单独使用外还可以和over函数结合使用。
开始看看具体使用方法:
select t.rank, t.Name from t_menu_item t;
rank Name
10 CLARK
10 KING
10 MILLER
20 ADAMS
20 FORD
20 JONES
20 SCOTT
20 SMITH
30 ALLEN
30 BLAKE
30 JAMES
30 MARTIN
30 TURNER
30 WARD
上边的查询语句返回的结果可以清晰看到rank存在重复的,一个相同的rank对应多个Name,如果我们想把某一个Rank的所有Name以","隔开,怎么做的,当然可以自定义函数,
别急,Oracle 10g开始提供了这个wmsys.wm_concat,它可以帮助我们把行的值以逗号隔开,看看怎么来实现.
一。直接使用wmsys.wm_concat
通过Group by进行分组,查询每类Rank对应的Name的值,看看查询的结果.
10 CLARK, KING, MILLER
20 ADAMS, FORD, JONES, SCOTT, SMITH
30 ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD
是不是很神奇,rank已经分类,并且他的Name已经用逗号进行隔开。
二.wmsys.wm_concat和over的结合使用
wmsys.wm_concat除了单独使用外还可以和over函数结合使用。
开始看看具体使用方法:
select t.rank, t.Name from t_menu_item t;
rank Name
10 CLARK
10 KING
10 MILLER
20 ADAMS
20 FORD
20 JONES
20 SCOTT
20 SMITH
30 ALLEN
30 BLAKE
30 JAMES
30 MARTIN
30 TURNER
30 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, MILLER
20 ADAMS, FORD, JONES, SCOTT, SMITH
30 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
相关文章推荐
- oracle 函数WMSYS.WM_CONCAT()的用法(让查询结果行转列)
- oracle 函数WMSYS.WM_CONCAT()的用法(行转列)
- Oracle: wmsys.wm_concat、sys_connect_by_path、自定义函数实现行列转换
- 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 UNPIVOT,PIVOT,WMSYS.WM_CONCAT三个函数
- oracle内置函数 wmsys.wm_concat使用
- 关于oracle中的wmsys.wm_concat中的使用问题
- oracle中的wmsys.wm_concat()函数
- [oracle]百思不得其解:wmsys.wm_concat的用法与数据库版本的问题
- Oracle 行拼接 wmsys.wm_concat扩展
- ORACLE wm_concat (wmsys.) 函数(行列转换函数)
- oracle 内部函数 wmsys.wm_concat
- oracle 列转行函数 WMSYS.WM_CONCAT 排序不规则处理
- oracle合并多条数据为一条 wmsys.wm_concat
- Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)