日期:2014-05-17  浏览次数:20812 次

统计的sql语句怎么写?
表TestA中有如下数据
ID,NAME,TYPE,CARD_ID
1,tom,A,0001
2,tom,A,0002
3,tom,B,0003
4,jack,A,0004
5,jack,A,0005
现在要求的结果是:
1,tom,A,0001,0002
2,tom,B,0003
3,jack,A,0004,0005

------解决方案--------------------
SQL> select distinct
2 yy.name,
3 yy.type,
4 ltrim(first_value(path) over(partition by yy.name,yy.type order by lev desc), ', ') card_id
5 from (
6 select zz.id,
7 zz.name,
8 zz.type,
9 zz.card_id,
10 level lev,
11 sys_connect_by_path(zz.card_id, ', ') path
12 from (
13 select tt.*,
14 tt.name || tt.type || row_number() over(partition by tt.name,tt.type order by tt.name,tt.type) left_rn,
15 tt.name || tt.type || (row_number() over(partition by tt.name,tt.type order by tt.name,tt.type) +1) right_rn
16 from (
17 select 1 as Id, 'tom ' as name, 'A ' as type, '0001 ' as CARD_ID from dual
18 union all
19 select 2 as Id, 'tom ' as name, 'A ' as type, '0002 ' as CARD_ID from dual
20 union all
21 select 3 as Id, 'tom ' as name, 'B ' as type, '0003 ' as CARD_ID from dual
22 union all
23 select 4 as Id, 'jack ' as name, 'A ' as type, '0004 ' as CARD_ID from dual
24 union all
25 select 5 as Id, 'jack ' as name, 'A ' as type, '0005 ' as CARD_ID from dual
26 )tt
27 )zz
28 connect by prior left_rn = right_rn
29 )yy;

NAME TYPE CARD_ID
---- ---- --------------------------------------------
jack A 0005,0004
tom A 0002,0001
tom B 0003