oracle的wm_concat函數實現行轉列

來源:互聯網
上載者:User

標籤:from   完美解決   str   11gr2   cti   case   center   bms   連結   

有以下資料

deptname phone username isboss
部門A 電話1 員工A 0
部門A 電話1 領導A 1
部門B 電話2 員工B 0
部門B 電話2 員工C 0
部門B 電話2 領導D 1

 

需要展示效果

deptname phone boss emp
部門A 電話1 領導A 員工A
部門B 電話2 領導D 員工B,員工C

因為是oracle10g的原因,所以使用了wm_concat函數,但對wm_concat結果長度有限制,超出會報ORA-22922:不存在的LOB值,這是後話,先貼代碼

Select t5.deptname,       Max(t5.tel),       dbms_lob.substr(wmsys.wm_concat(To_Char(t5.boss))) boss,       dbms_lob.substr(wmsys.wm_concat(To_Char(t5.notboss))) notboss  From (Select t1.NAME deptname,               t1.TEL tel,               Case t2.ISBOSS                 When 1 Then                  t2.TRUE_NAME               End boss,               Case t2.ISBOSS                 When 0 Then                  t2.TRUE_NAME               End notboss          From t_duty t          Left Join t_department t1            On t.DEP_ID = t1.DEP_ID          Left Join t_contacts t2            On t.CONTACTS_ID = t2.CONTACTS_ID         Where t.DUTY_TIME = Trunc(SysDate) ) t5 Group By t5.deptname

同樣的情況的如果是oracle11gR2版本可以用LISTAGG函數,據說可以解決上面的報錯問題,這個有待以後測試

但是我現在的是10g的,而且會報上面的錯誤,網上的一些解決方案都沒解決,有人寫了自訂函數,親測完美解決

原出處已經找不到了,就不貼連結了,但還是非常感謝解決了這個問題

create or replace TYPE zh_concat_imAUTHID CURRENT_USER AS OBJECT(  CURR_STR VARCHAR2(32767),  STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im) RETURN NUMBER,  MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im,               P1 IN VARCHAR2) RETURN NUMBER,  MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN zh_concat_im,                                 RETURNVALUE OUT VARCHAR2,                                 FLAGS IN NUMBER)                     RETURN NUMBER,  MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT zh_concat_im,                    SCTX2 IN  zh_concat_im) RETURN NUMBER);/create or replace TYPE BODY zh_concat_imIS  STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im)  RETURN NUMBER  IS  BEGIN    SCTX := zh_concat_im(NULL) ;    RETURN ODCICONST.SUCCESS;  END;  MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im,          P1 IN VARCHAR2)  RETURN NUMBER  IS  BEGIN    IF(CURR_STR IS NOT NULL) THEN      CURR_STR := CURR_STR || ‘:‘ || P1;    ELSE      CURR_STR := P1;    END IF;    RETURN ODCICONST.SUCCESS;  END;  MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN zh_concat_im,                                 RETURNVALUE OUT VARCHAR2,                                 FLAGS IN NUMBER)    RETURN NUMBER  IS  BEGIN    RETURNVALUE := CURR_STR ;    RETURN ODCICONST.SUCCESS;  END;  MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT zh_concat_im,                                   SCTX2 IN zh_concat_im)  RETURN NUMBER  IS  BEGIN    IF(SCTX2.CURR_STR IS NOT NULL) THEN      SELF.CURR_STR := SELF.CURR_STR || ‘:‘ || SCTX2.CURR_STR ;    END IF;    RETURN ODCICONST.SUCCESS;  END;END;/create or replace FUNCTION zh_concat(P1 VARCHAR2)RETURN VARCHAR2 AGGREGATE USING zh_concat_im ;/

 

oracle的wm_concat函數實現行轉列

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.