標籤:
【上一專題】 行列轉換1 -- PIVOT與UNPIVOT函數的介紹
實現案例1001 lufei1001 shanzhi1001 namei1001 qiaoba實現效果如下:1001 lufei,shanzhi,namei,qiaoba典型的行列轉換:實現這種方法有很多。其中oracle11g之後提供了listagg函數;用來實現上面的效果最好不過了;我們來看下listagg文法listagg函數的文法結構如下: >listagg( [,]) within group (order by ) [over (partition by )] listagg雖然是彙總函式,但可以提供分析功能(比如可選的OVER()子句)。 使用listagg中,下列中的元素是必須的: 需要彙總的列或者運算式 WITH GROUP 關鍵詞 分組中的ORDER BY子句 下面將示範listagg函數使用的例子本文描述了在oracle 11g release 2 版本中新增的listagg函數,listagg是一個實現字串彙總的oracle內建函數先實現案例代碼
--listagg方法 11g之後推薦使用這種SELECT NO, listagg(EMP, ‘,‘) within GROUP (ORDER BY NULL) AS valsFROM onepieceGROUP BY NO ;--wmsys.wm_concat方法 --11之前可使用這種SELECT NO, WMSYS.WM_CONCAT(emp) AS valsFROM onepieceGROUP BY NO;--使用集合函數;在用to_string函數將集合轉換為字串。需10g以上SELECT NO, TO_STRING(CAST(COLLECT(emp) AS varchar2_ntt)) AS valsFROM onepieceGROUP BY NO;
上面我們看到listagg函數文法中有over函數;當然我們的listagg也可以做分析函數
SELECT NO, listagg(EMP, ‘,‘) within GROUP (ORDER BY NULL) over (partition by no)FROM onepiece
第3種實現的方法中有to_string函數;其中原始碼如下:
CREATE OR REPLACE FUNCTION to_string( nt_in IN varchar2_ntt, delimiter_in IN VARCHAR2 DEFAULT ‘,‘) RETURN VARCHAR2 IS v_idx PLS_INTEGER; v_str VARCHAR2(32767); v_dlm VARCHAR2(10);BEGIN v_idx := nt_in.FIRST; WHILE v_idx IS NOT NULL LOOP v_str := v_str || v_dlm || nt_in(v_idx); v_dlm := delimiter_in; v_idx := nt_in.NEXT(v_idx); END LOOP; RETURN v_str;END to_string;
最後:上面的效果反之呢?因為還有一個知識點沒有講解;暫時不提供。
作者 : li0924
時間 : 2015-01-12
本文著作權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連.
oracle進階SQL(四)--SQL行列轉換專題2