加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 16:06:15 所属栏目:百科 来源:网络整理
导读:Oracle数据库合并行记录,WMSYS.WM_CONCAT 函數的用法 博客分类: Oracle Sql代码 select t.rank,t. Name from t_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

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

    博客分类:
  • Oracle
Sql代码
  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 函数即可以完成 行转列的效果

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()

    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;

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读