3 回答
TA贡献1853条经验 获得超18个赞
LISTAGG函数是DB2 LUW 9.7中的新函数
参见示例:
create table myTable (id int, category int);
insert into myTable values (1, 1);
insert into myTable values (2, 2);
insert into myTable values (5, 1);
insert into myTable values (3, 1);
insert into myTable values (4, 2);
示例:在分组列中不按任何顺序进行选择
select category, LISTAGG(id, ', ') as ids from myTable group by category;
结果:
CATEGORY IDS
--------- -----
1 1, 5, 3
2 2, 4
示例:在分组列中使用order by子句进行选择
select
category,
LISTAGG(id, ', ') WITHIN GROUP(ORDER BY id ASC) as ids
from myTable
group by category;
结果:
CATEGORY IDS
--------- -----
1 1, 3, 5
2 2, 4
TA贡献1982条经验 获得超2个赞
我认为通过这个较小的查询,您可以做您想做的事情。这等效于DB2中MySQL的GROUP_CONCAT。
SELECT
NUM,
SUBSTR(xmlserialize(xmlagg(xmltext(CONCAT( ', ',ROLES))) as VARCHAR(1024)), 3) as ROLES
FROM mytable
GROUP BY NUM;
这将输出类似:
NUM ROLES
---- -------------
1 111, 333, 555
2 222, 444
假设您的原始结果是这样的:
NUM ROLES
---- ---------
1 111
2 222
1 333
2 444
1 555
TA贡献1811条经验 获得超6个赞
根据您拥有的DB2版本,可以使用XML函数来实现此目的。
带有一些数据的示例表
create table myTable (id int, category int);
insert into myTable values (1, 1);
insert into myTable values (2, 2);
insert into myTable values (3, 1);
insert into myTable values (4, 2);
insert into myTable values (5, 1);
使用xml函数汇总结果
select category,
xmlserialize(XMLAGG(XMLELEMENT(NAME "x", id) ) as varchar(1000)) as ids
from myTable
group by category;
结果:
CATEGORY IDS
-------- ------------------------
1 <x>1</x><x>3</x><x>5</x>
2 <x>2</x><x>4</x>
使用替换使结果看起来更好
select category,
replace(
replace(
replace(
xmlserialize(XMLAGG(XMLELEMENT(NAME "x", id) ) as varchar(1000))
, '</x><x>', ',')
, '<x>', '')
, '</x>', '') as ids
from myTable
group by category;
清理结果
CATEGORY IDS
-------- -----
1 1,3,5
2 2,4
刚看到使用XMLELEMENT的XMLTEXT而不是一个更好的解决方案在这里。
添加回答
举报