sql中有聚集函数sum,但只能计算数值型,如(本文中试验都是在scott用户下):' F; q. }( }9 }
SQL> select deptno,sum(sal) asal8 ~* W# ~4 C4 b; f3 D
from emp a
$ C, d' P; R9 S3 m" E+ l& d group by deptno;
4 b/ c0 o& k$ b' ]; |1 U/ ` DEPTNO ASAL* K6 E0 f) m& k: U, M' f
30 9400# z+ G" u( {5 i1 y' M# Q4 w4 H L
20 108752 m9 \# z& [* c3 }' M
10 8750 l% W H4 E, T9 j$ S
有时要想分组查看每个部门的人员列表如下结果:7 x! J6 y3 E) L
DEPTNO ENAME
& Z J7 P2 x7 Y( e5 h 10 CLARK,KING,MILLER, R$ Z3 h4 K3 W" e6 O2 z7 @
20 SMITH,FORD,ADAMS,SCOTT,JONES* x5 e$ p9 p; c' Q$ a; s7 R; `
30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD+ v+ }* N& a6 E! E* m: Y
标准sql没有提供这个方法。
3 x; L% a$ R. z1 W5 \% | SQL> select deptno,sum(ename) ename
W" H* [8 T2 L3 `1 S' L+ C5 S from emp a
+ B% u& b+ o% ^& K/ b( ? group by deptno;
% X! K0 w, y# }) I; w select deptno,sum(ename) ename" P' V3 D! g- \7 ]3 z9 E2 b
*
% @( X0 `& A3 S# P* M8 W) r 第 1 行出现错误:- }6 D$ L, F3 l7 o$ x. P
ORA01722: 无效数字
& ~ X% E( g7 U2 s% Y8 F0 _( v oracle10g提供了一个函数wmsys.wm_concat可以实现:
1 f: |) j- W7 w& i: @ SQL> select deptno,wmsys.wm_concat(ename) ename
, N* c3 C% `# X. I! R. @1 m& t from emp a
2 k6 u: k! |; |8 [- C$ o group by deptno;7 p6 G3 G+ d4 N4 c, s2 G
DEPTNO ENAME
( A( y# Q1 J1 u, c; ?# l# ~4 h 10 CLARK,KING,MILLER
$ o! p: ? |3 }% V( |; M+ E$ Y 20 SMITH,FORD,ADAMS,SCOTT,JONES# w0 i6 E/ K3 S: Q
30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD
9 o9 N' D" k8 c# Q6 h0 Q" f+ q 正是想要的结果。
+ v, {" O$ d7 ~ e 但是在10g以下版本怎么办呢?
! G! u5 Y' }1 |8 K. h. U 在oracle9i可以用connect by 实现,但成本很高:
1 v* O# @1 \7 F* [ SQL> select deptno,substr(max(sys_connect_by_path(ename,',')),2) ename1 H% c6 j" R( w d7 E
from (select a.*,row_number()over(partition by deptno order by empno) rn from emp a )
7 j$ _4 i* h, q7 Y- g group by deptno/ C, F& `! p. P0 b# b
start with rn=16 B4 Y9 n# m5 K5 O; {: W
connect by rn1=prior rn and deptno=prior deptno
m! P9 n: Y9 p& I3 W( K! N order by deptno;* y$ i2 @2 }: [5 q I
DEPTNO ENAME2 X5 ?( l; J# ?0 d* Z
10 CLARK,KING,MILLER& M' y/ g5 |& }% A- E0 v( L
20 SMITH,JONES,SCOTT,ADAMS,FORD) Z7 j; _, b' o: h
30 ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES
& Z+ x+ e. i1 V8 n- h2 u 结果也正确。这个sql参考了一下其他人的例子,并用到了分析函数。 |