Oracle中的wmsys.wm_concat
Oracle中的wmsys.wm_concat主要實(shí)現(xiàn)行轉(zhuǎn)列功能(說(shuō)白了就是將查詢(xún)的某一列值使用逗號(hào)進(jìn)行隔開(kāi)拼接,成為一條數(shù)據(jù))。
wmsys.wm_concat除了單獨(dú)使用外還可以和over函數(shù)結(jié)合使用。
開(kāi)始看看具體使用方法:
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
上邊的查詢(xún)語(yǔ)句返回的結(jié)果可以清晰看到rank存在重復(fù)的,一個(gè)相同的rank對(duì)應(yīng)多個(gè)Name,如果我們想把某一個(gè)Rank的所有Name以","隔開(kāi),怎么做的,當(dāng)然可以自定義函數(shù),
別急,Oracle 10g開(kāi)始提供了這個(gè)wmsys.wm_concat,它可以幫助我們把行的值以逗號(hào)隔開(kāi),看看怎么來(lái)實(shí)現(xiàn).
一。直接使用wmsys.wm_concat
select t.rank, WMSYS.WM_CONCAT(t.Name) TIME From t_menu_item t GROUP BY t.rank;通過(guò)Group by進(jìn)行分組,查詢(xún)每類(lèi)Rank對(duì)應(yīng)的Name的值,看看查詢(xún)的結(jié)果.
??? 10 CLARK, KING, MILLER
????20 ADAMS, FORD, JONES, SCOTT, SMITH
????30 ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD?
是不是很神奇,rank已經(jīng)分類(lèi),并且他的Name已經(jīng)用逗號(hào)進(jìn)行隔開(kāi)。
二.wmsys.wm_concat和over的結(jié)合使用
over函數(shù):?over函數(shù)指定了分析函數(shù)工作的數(shù)據(jù)窗口的大小,這個(gè)數(shù)據(jù)窗口大小可能會(huì)隨著行的變化而變化。 例如:? over(order by salary)按照salary排序進(jìn)行累計(jì),order by是個(gè)默認(rèn)的開(kāi)窗函數(shù); ?over(partition by deptno) 按照部門(mén)分區(qū);? over(order by salary?range between 50 preceding and 150 following)每行對(duì)應(yīng)的數(shù)據(jù)窗口是之前行幅度值不超過(guò)50,之后行幅度值不超過(guò)150的數(shù)據(jù)記錄 ; 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的結(jié)合例子: select id,wmsys.wm_concat(name) over (order by id,name) name from idtable; 根據(jù)id,name進(jìn)行排序累計(jì),看看輸出的結(jié)果. 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(當(dāng)然這幾個(gè)值肯定是id為10對(duì)應(yīng)的值),id為20的name列的值是從ab,bc,cd,hi(之所以不是從ab開(kāi)始是因?yàn)楫?dāng)前order by的 還有name列,所以需要繼續(xù)向下進(jìn)行)一直到ab,bc,cd,hi,ij,mnke. select id,wmsys.wm_concat(name) over (partition by id) name from idtable; 這個(gè)例子僅僅是根據(jù)id進(jìn)行排序(over (order by ename)如果沒(méi)有order by 子句,求和就不是“連續(xù)”的,這個(gè)就是和上個(gè)實(shí)例的最大區(qū)別,沒(méi)有連續(xù))。 ?? ? ? ?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
可以看到僅僅是根據(jù)id進(jìn)行排序的查詢(xún)。 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 可以看到,這里和上個(gè)實(shí)例的區(qū)別在于Name列沒(méi)有疊加,因?yàn)樵趏ver 中加入了name
轉(zhuǎn)載于:https://www.cnblogs.com/ListenFly/archive/2011/10/17/2215863.html
總結(jié)
以上是生活随笔為你收集整理的Oracle中的wmsys.wm_concat的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IMX6ULL uboot启动分析(五)
- 下一篇: JAVA实训心得体会(精选4篇)