Oracle数据库合并行记录,WMSYS.WM_CONCAT 函數的用法

前端之家收集整理的这篇文章主要介绍了Oracle数据库合并行记录,WMSYS.WM_CONCAT 函數的用法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. selectt.rank,t.Namefromt_menu_itemt;


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

--------------------------------
我们通过 10g 所提供的 WMSYS.WM_CONCAT 函数即可以完成 行转列的效果

Highlighter" id="" style="font-family:Monaco,WMSYS.WM_CONCAT(t.Name)TIMEFromt_menu_itemtGROUPBYt.rank;

DEPTNO ENAME
------ ----------
10 CLARK,KING,MILLER
20 ADAMS,FORD,JONES,SCOTT,SMITH
30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

例子如下:

sql>createtableidtable(idnumber,namevarchar2(30));
  • Tablecreated
  • insertintoidtablevalues(10,'ab');
  • 1rowinserted
  • 'bc');
  • 'cd');
  • values(20,'hi');
  • 'ij');
  • 'mn');
  • select*fromidtable;
  • ID NAME
    ---------- ------------------------------
    10 ab
    10 bc
    10 cd
    20 hi
    20 ij
    20 mn

    6 rows selected

    selectid,wmsys.wm_concat(name)namefromidtable2groupbyid;

    ID NAME
    ---------- --------------------------------------------------------------------------------
    10 ab,bc,cd
    20 hi,ij,mn

    name)over(orderbyid)fromidtable;

    ID NAME
    ---------- --------------------------------------------------------------------------------
    10 ab,cd
    10 ab,cd
    20 ab,cd,hi,mn
    20 ab,mn

    6 rows selected

    byid,85); font-weight:bold">fromidtable;

    ID NAME
    ---------- --------------------------------------------------------------------------------
    10 ab
    10 ab,bc
    10 ab,hi
    20 ab,ij
    20 ab,mn

    6 rows selected

    个人觉得这个用法比较有趣.

    name)over(partitionfromidtable;

    ID NAME
    ---------- --------------------------------------------------------------------------------
    10 ab
    10 bc
    10 cd
    20 hi
    20 ij
    20 mn

    6 rows selected

    ps:

    wmsys.wm_concat、sys_connect_by_path、自定义行数实现行列转换:

    CREATE TABLE tab_name(ID INTEGER NOT NULL PRIMARY KEY,cName VARCHAR2(20));
    CREATE TABLE tab_name2(ID INTEGER NOT NULL,pName VARCHAR2(20));

    INSERT INTO tab_name(ID,cName) VALUES (1,'百度');
    INSERT INTO tab_name(ID,cName) VALUES (2,'Google');
    INSERT INTO tab_name(ID,cName) VALUES (3,'网易');
    INSERT INTO tab_name2(ID,pName) VALUES (1,'研发部');
    INSERT INTO tab_name2(ID,'市场部');
    INSERT INTO tab_name2(ID,pName) VALUES (2,'平台架构');
    INSERT INTO tab_name2(ID,pName) VALUES (3,'研发部');
    COMMIT;

    期望结果:

    ID cName pName

    1 百度 研发部,市场部

    2 Google 研发部

    3 网易 研发部,平台架构

    方法一:使用wmsys.wm_concat()

    @H_995_301@SELECT t1.ID,t1.cName,wmsys.wm_concat(t2.pName) FROM tab_name t1,tab_name2 t2 WHERE t1.ID=t2.ID GROUP BY t1.cName,t1.id;

    方法二:使用sys_connect_by_path

    select id,cName,ltrim(max(sys_connect_by_path(pName,',')),') from (select row_number() over(PARTITION by t1.id ORDER by cName) r,t1.*,t2.pName from tab_name t1,tab_name2 t2 where t1.id = t2.id)
    start with r=1 CONNECT by prior r =r-1 and prior id = id group by id,cName order by id;

    方法三:使用自定义函数

    create or replace function coltorow(midId INT) RETURN VARCHAR2 is
    Result VARCHAR2(1000);
    begin
    FOR cur IN (SELECT pName FROM tab_name2 t2 WHERE midId=t2.id) LOOP
    RESULT:=RESULT||cur.pName||',';
    END LOOP;
    RESULT:=rtrim(RESULT,');
    return(Result);
    end coltorow;

    SELECT t1.*,coltorow(t1.ID) FROM tab_name t1,tab_name2 t2 WHERE t1.ID=t2.ID GROUP BY t1.ID,t1.cname ORDER BY t1.ID;

    猜你在找的Oracle相关文章