程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> oracle高級SQL(四)--SQL行列轉換專題2,oracle--sql

oracle高級SQL(四)--SQL行列轉換專題2,oracle--sql

編輯:Oracle教程

oracle高級SQL(四)--SQL行列轉換專題2,oracle--sql


  【上一專題】  行列轉換1  -- PIVOT與UNPIVOT函數的介紹


實現案例 1001 lufei 1001 shanzhi 1001 namei 1001 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 vals
FROM   onepiece
GROUP  BY NO ;
--wmsys.wm_concat方法 --11之前可使用這種
SELECT NO,
    WMSYS.WM_CONCAT(emp) AS vals
FROM   onepiece
GROUP  BY NO;
--使用集合函數;在用to_string函數將集合轉換為字符串。需10g以上
SELECT NO,
    TO_STRING(CAST(COLLECT(emp) AS varchar2_ntt)) AS vals
FROM   onepiece
GROUP  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

本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接.


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved