Oracle列转行和行转列的几种用法

1970-01-01 08:00

列转行

主要讨论sys_connect_by_path的使用方法。

1、带层次关系

SQL> create table dept(deptno number,deptname varchar2(20),mgrno number);

Table created.

SQL> insert into dept values(1,'总公司',null);

1 row created.

SQL> insert into dept values(2,'浙江分公司',1);

1 row created.

SQL> insert into dept values(3,'杭州分公司',2);

1 row created.

SQL> commit;

Commit complete.

SQL> select max(substr(sys_connect_by_path(deptname,','),2)) from dept connect by prior deptno=mgrno;

MAX(SUBSTR(SYS_CONNECT_BY_PATH(DEPTNAME,','),2))

-------------------------------------------------------------------------------- 总 公司,浙江分公司,杭州分公司

2、行列转换

如把一个表的所有列连成一行,用逗号分隔:

SQL> select max(substr(sys_connect_by_path(column_name,','),2))

from (select column_name,rownumrn from user_tab_columns where table_name ='DEPT') start with rn=1 connect by rn=rownum ;

MAX(SUBSTR(SYS_CONNECT_BY_PATH(COLUMN_NAME,','),2))

-------------------------------------------------------------------------------- DEPTNO,DEPTNAME,MGRNO

3、ListAgg(Oracle 11g)

SQL> select deptno,

2 listagg(ename, '; ' )

3 within group

4 (order by ename) enames

5 from emp

6 group by deptno

7 order by deptno 8 /

DEPTNO ENAMES

--------- -------------------

10 CLARK; KING; MILLER

20 ADAMS; FORD; JONES;

SCOTT; SMITH

30 ALLEN; BLAKE;

JAMES; MARTIN;

TURNER; WARD

下面是列转行的二个用法 1

with temp as (select account_no, user_party_id, data_hierarchy_id from t_cc_l2_employee

whereaccount_no is not null)

selectaccount_no, user_party_id from temp union all

selectaccount_no, data_hierarchy_id from temp 2

SELECT account_no, cn, cv FROM (

select distinct account_no, user_party_id, data_hierarchy_id from t_cc_l2_employee whereaccount_no is not null anduser_party_id is not null anddata_hierarchy_id is not null) MODEL

RETURN UPDATED ROWS

PARTITION BY (account_no) DIMENSION BY (0 AS n)

MEASURES ('xx' AS cn,'yyyyyy' AS cv, user_party_id, data_hierarchy_id) RULES UPSERT ALL (

cn[1] = 'c1', cn[2] = 'c2',

cv[1] = user_party_id[0], cv[2] = data_hierarchy_id[0] )

ORDER BY account_no,cn;

-- 注意点:model语法SQL经常会遇到二个问题

1 ORA-32638: Non unique addressing in MODEL dimensions (问题出在被Model的结果集中的partition by对应的column有重复值)

2 ORA-25137 Data value out of range (将'yyyyyy' AS cv 中的'yyyyyy' 扩大几位就可能解决您的问题了)


Oracle列转行和行转列的几种用法.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:小数乘法 说课稿

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: