阿木申 申楠

热衷编程技术 | 申楠 : qq:38371354 | msn:amushen2005@hotmail.com

导航

纵表变横表

Posted on 2007-05-18 16:07  阿木申  阅读(463)  评论(0编辑  收藏  举报

The objective of this function is to transpose rows to columns.

This RowToCol function is built with invoker-rights AUTHID CURRENT_USER. The function works on tables/views of the user who invokes the function, not on the owner of this function.

RowToCol takes two parameters:

1. SQL Statement: You can pass any valid SQL statement to this function.
2. Delimiter: You can pass any character as a delimiter. Default value is `,?

CREATE OR REPLACE FUNCTION ROWTOCOL(P_SLCT IN VARCHAR2,

                  P_DLMTR IN VARCHAR2 DEFAULT ',') RETURN VARCHAR2

AUTHID CURRENT_USER AS

  TYPE C_REFCUR IS REF CURSOR;

  LC_STR VARCHAR2(4000);

  LC_COLVAL VARCHAR2(4000);

  C_DUMMY C_REFCUR;

  L NUMBER;

BEGIN

  OPEN C_DUMMY FOR P_SLCT;

  LOOP

    FETCH C_DUMMY

      INTO LC_COLVAL;

    EXIT WHEN C_DUMMY%NOTFOUND;

    LC_STR := LC_STR || P_DLMTR || LC_COLVAL;

  END LOOP;

  CLOSE C_DUMMY;

  RETURN SUBSTR(LC_STR, 2);

EXCEPTION

  WHEN OTHERS THEN

    LC_STR := SQLERRM;

    IF C_DUMMY%ISOPEN THEN

      CLOSE C_DUMMY;

    END IF;

    RETURN LC_STR;

END;

具体使用 方法

(1)

SELECT A.DEPTNO,

       A.DNAME,

       A.LOC,

       ROWTOCOL('SELECT DISTINCT job FROM emp WHERE deptno = ' || A.DEPTNO) AS JOBS

  FROM DEPT A;

(2)

SELECT DISTINCT A.JOB,

                ROWTOCOL('SELECT ename FROM emp WHERE job = ' || '''' ||

                         A.JOB || '''' || ' ORDER BY ename') AS EMPLOYEES

  FROM EMP A;

(3)

SELECT DISTINCT customer_id, rowtocol ('SELECT FEE_TYPE_NO

  FROM CUSTOMER_FEE_MONTH T where CUSTOMER_ID='

  ||customer_id)

 FROM CUSTOMER_FEE_MONTH

WHERE CUSTOMER_ID = '0000011996'

 AND year_month='200702' ;

(4)

多个条件加入

SELECT DISTINCT A.year_month,A.customer_id, rowtocol ('SELECT FEE

  FROM CUSTOMER_FEE_MONTH T where  CUSTOMER_ID ='||'''0000011996'''||'

AND fee_type_no='||'''153'''||'and CUSTOMER_ID='

  ||A.customer_id || 'and year_month='||A.YEAR_MONTH)

 FROM CUSTOMER_FEE_MONTH A

WHERE CUSTOMER_ID = '0000011996'