遇到这么一个问题
id | a | b | c | d | e |
1 | 1 | 1 | 1 | 1 | 1 |
1 | 2 | 2 | 2 | 2 | 2 |
1 | 3 | 3 | 3 | 3 | 3 |
2 | 4 | 4 | 4 | 4 | 4 |
2 | 5 | 5 | 5 | 5 | 5 |
3 | 6 | 6 | 6 | 6 | 6 |
4 | 7 | 7 | 7 | 7 | 7 |
5 | 8 | 8 | 8 | 8 | 8 |
5 | 9 | 9 | 9 | 9 | 9 |
这是表结构,我想查询出这样的结果
id | a | b | c | d | e |
1 | 1,2,3 | 1,2,3 | 1,2,3 | 1,2,3 | 1,2,3 |
2 | 4,5 | 4,5 | 4,5 | 4,5 | 4,5 |
3 | 6 | 6 | 6 | 6 | 6 |
4 | 7 | 7 | 7 | 7 | 7 |
5 | 8,9 | 8,9 | 8,9 | 8,9 | 8,9 |
在oracle中有一个函数wm_concat,用这个函数就可以了
select t.id,
wm_concat(t.a) a,
wm_concat(t.b) b,
wm_concat(t.c) c,
wm_concat(t.d) d,
wm_concat(t.e) e from table t group by t.id;
然而,这个函数的局限性在于,查出来的结果,字段类型是<clob>
其实除了这个wm_concat函数之外,oracle中还提供了另一个函数listagg,也可以完成这样的效果
select t.id,
listagg(t.a, ',') within GROUP(order by t.a) a,
listagg(t.b, ',') within GROUP(order by t.b) b
from tmp_test t
group by t.id