select * from DEMO.TEST;
ID |
NAME |
AGE |
ADDRES |
1 |
cx |
1 |
湖北 |
1 |
cx |
1 |
湖北 |
1 |
cx |
0.1 |
湖北 |
1 |
cx |
0.1 |
湖北 |
1 |
cx1 |
1 |
湖北 |
1 |
cx2 |
1 |
湖北 |
1 |
cx1 |
0.1 |
湖北 |
1 |
cx2 |
0.1 |
湖北 |
1 |
cx |
1 |
湖南 |
1 |
cx |
1 |
长沙 |
1 |
cx |
0.1 |
上海 |
1 |
cx |
0.1 |
长沙 |
1 |
cx1 |
1 |
湖南 |
1 |
cx2 |
1 |
上海 |
1 |
cx1 |
0.1 |
长沙 |
1 |
cx2 |
0.1 |
上海 |
wm_concat(列名)函数
:该函数可以把列值以”,“逗号分隔起来,并显示成一行;
select id,name,age,REPLACE(wm_concat(address), ',', ';') from DEMO.TEST group by id,name,age;
ID |
NAME |
AGE |
REPLACE(WM_CONCAT(ADDRESS),‘,’,‘;’) |
1 |
cx |
0.1 |
湖北;长沙;上海;湖北 |
1 |
cx |
1 |
湖北;长沙;湖南;湖北 |
1 |
cx1 |
0.1 |
湖北;长沙 |
1 |
cx1 |
1 |
湖北;湖南 |
1 |
cx2 |
0.1 |
湖北;上海 |
1 |
cx2 |
1 |
湖北;上海 |
看似好像没有什么问题,现在我们来将number 类型的合并一下:
ID |
NAME |
ADDRESS |
REPLACE(WM_CONCAT(AGE),‘,’,‘;’) |
1 |
cx |
长沙 |
1;.1 |
1 |
cx |
湖北 |
1;.1;.1;1 |
1 |
cx |
湖南 |
1 |
1 |
cx |
上海 |
.1 |
1 |
cx1 |
长沙 |
.1 |
1 |
cx1 |
湖北 |
1;.1 |
1 |
cx1 |
湖南 |
1 |
1 |
cx2 |
湖北 |
1;.1 |
1 |
cx2 |
上海 |
1;.1 |
发现端倪了,在number类型转换成varchar类型时, .前面的0会被自动省略掉.此时我们需要对参数做一下判断: |
|
|
|
select id,name,address,REPLACE(wm_concat(nvl(nullif(substr(to_char(age),0,1),'.'),'0'||to_char(age))), ',', ';') from DEMO.TEST group by id,name,address;
ID |
NAME |
ADDRESS |
REPLACE(WM_CONCAT(NVL(NULLIF(SUBSTR(TO_CHAR(AGE),0,1),‘.’),‘0’\\TO_CHAR(AGE))),‘,’,‘;’) |
1 |
cx |
长沙 |
1;0.1 |
1 |
cx |
湖北 |
1;0.1;0.1;1 |
1 |
cx |
湖南 |
1 |
1 |
cx |
上海 |
0.1 |
1 |
cx1 |
长沙 |
0.1 |
1 |
cx1 |
湖北 |
1;0.1 |
1 |
cx1 |
湖南 |
1 |
1 |
cx2 |
湖北 |
1;0.1 |
1 |
cx2 |
上海 |
1;0.1 |
可以看出上述经过合并后,并没有排序,此时可以用另外一个与其有相似功能的函数LISTAGG:
SELECT id,name,address,LISTAGG(nvl(nullif(substr(to_char(age),0,1),'.'),'0'||to_char(age)),',') WITHIN GROUP(ORDER BY age) AS columns
FROM DEMO.TEST
group by id,name,address;
ID |
NAME |
ADDRESS |
COLUMNS |
1 |
cx |
长沙 |
0.1,1 |
1 |
cx |
湖北 |
0.1,0.1,1,1 |
1 |
cx |
湖南 |
1 |
1 |
cx |
上海 |
0.1 |
1 |
cx1 |
长沙 |
0.1 |
1 |
cx1 |
湖北 |
0.1,1 |
1 |
cx1 |
湖南 |
1 |
1 |
cx2 |
湖北 |
0.1,1 |
1 |
cx2 |
上海 |
0.1,1 |