请教一个sql文
表如下
NO SIC AREA
VARCHAR2 VARCHAR2 VARCHAR2
910802011 91 19
910802011 91 24
910801011 91 19
910801011 91 48
910801011 91 50
要得到这样的数据,取同一NO的所有AREA
NO AREA
910802011 19,24
910801011 19,48,50
不用存储过程,用SQL文能不能实现。
表如下
NO SIC AREA
VARCHAR2 VARCHAR2 VARCHAR2
910802011 91 19
910802011 91 24
910801011 91 19
910801011 91 48
910801011 91 50
要得到这样的数据,取同一NO的所有AREA
NO AREA
910802011 19,24
910801011 19,48,50
不用存储过程,用SQL文能不能实现。
Oracle9i中使用SYS_CONNECT_BY_PATH进行行列转换- -
有表:
SQL> SELECT deptno, ename FROM emp ORDER BY deptno, ename;DEPTNO ENAME
------ ----------
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 WARD14 rows selected.
想输出为:
DEPTNO ENAME
------ ----------
10 CLARK, KING, MILLER
20 ADAMS, FORD, JONES, SCOTT, SMITH
30 ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD 除了使用聚集函数或者存储过程之外,9i中可以:
SQL> SELECT deptno
2 , LTRIM(MAX(SYS_CONNECT_BY_PATH(ename,','))
3 KEEP (DENSE_RANK LAST ORDER BY curr),',') AS concatenated
4 FROM ( SELECT deptno
5 , ename
6 , ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) AS curr
7 , ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) -1 AS prev
8 FROM emp )
9 GROUP BY deptno
10 CONNECT BY prev = PRIOR curr AND deptno = PRIOR deptno
11 START WITH curr = 1;
DEPTNO----------CONCATENATED----------------------------------------------------------------------------------------------------
10CLARK,KING,MILLER
20ADAMS,FORD,JONES,SCOTT,SMITH
30ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD10CLARK,KING,MILLER 20ADAMS,FORD,JONES,SCOTT,SMITH 30ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
如
create table tb
(
id number,
name varchar2(100)
);
insert into tb values(1,'aa');
insert into tb values(2,'bb');
insert into tb values(3,'cc');
insert into tb values(1,'dd');
insert into tb values(1,'ee'); 实现
1 aa,dd,ee
2 bb
3 cc
--------------------------create or replace function t_f
(
v_id number
)
return varchar2
is
result varchar2(5000);
begin
result := '';
for x in (select name from tb where id = v_id)
loop
result := result || x.name || ',';
end loop; result := substr(result, 1, length(result) - 1);
return result;
end t_f;
select id, t_f(id) as name from (select distinct id from tb) x