db2 sum 统计_DB2递归实现字符串sum group by操作

本文介绍了DB2如何使用WITH语句进行递归查询,详细解析了递归查询的三个关键部分:虚拟表、初始化表和辅助表。通过一个实时表的例子,展示了如何按人名汇总并拼接每个人去过的地方,最后给出了具体的SQL实现代码,实现了将人到过的城市以'#'分隔的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先补充点儿DB2递归的基础知识(人懒,并且发现前人已总结的很好了,故"借"来一用):

db2中的递归查询使用with来实现,也称为公共表达式,公共表达式在select语句的开始部分采用with子句的形式,在使用公共表达式的查询中可以多次使用它,并且公共表达式还可以通过取别名来连接到他本身,这样的话就可以达到循环的目的。

递归查询通常有3个部分需要定义:

一:一个公共表达式形式的虚拟表。

二:一个初始化表。

三:一个与虚拟表进行完全内连接的辅助表。

需要使用UNION all合并上边3个查询,然后用select从递归输出中得到最终的结果。

大体上如下形式

with XX(x1,x2,x3) as  -------@0

(

select a.s,a.s1 from a  ----@1

union all  ----@2

select * from a,xx where a.s=xx.x1 ------@3

)

select ... from xx where .... -------@4

@0:为with体,即虚拟表

@1:为初始化表,这里需要定义初始化的一些行,也就是你递归的出发点,或者说父行,这部分逻辑只执行一次,它的结果作为虚拟表递归的初始化内容。

@2:这里必须用UNION all

@3:这里需要定义递归的条件(辅助表),这里定义递归的逻辑,需要注意的是父行和子行进行连接的时候逻辑一定要清楚父子关系,不然很容易变成死循环的,这里首先将初始化表的结果作为条件进行查询,在把执行的结果添加到虚拟表中,只要这里能查询出来记录,那么就会进行下一步递归循环。

@4:这里就是对虚拟表的查询语句。

PS:以上内容出处http://bbs.**.com/thread-32831-1-1.html

下面虽然也有,但是如果再借,就有点儿...不够意思咯,还是自己敲两行代码吧。

需求:一张实时表,一个人每到一个地方,就有一条记录存在,存放样例:

张三 上海

张三 杭州

.....

要求,按人名进行汇总,将他到过的地方拼接,中间用'#'分隔

数据准备:

--创建表:

CREATE TABLE Recursive_Test

(User_Name VARCHAR(12),

City VARCHAR(12));

--数据插入

INSERT INTO Recursive_Test(User_Name,City)

values ('张三','杭州'),('张三','郑州'),('李四','杭州'),

('张三','南昌'),('李四','广州'),('王五','北京');

-----递归实现:

WITH Recursive_Test_Par(User_Name,City,Rk_Num) as(

SELECT User_Name,City,ROW_NUMBER() OVER(PARTITION BY User_Name) --分组,生成序列,自我关联之用

FROM Recursive_Test

),

City_Join(User_Name,City,R_Num) as(

SELECT User_Name,CAST(City AS VARCHAR(100)),Rk_Num from Recursive_Test_Par WHERE Rk_Num=1

UNION ALL

SELECT a1.User_Name,CAST(a1.City||'#'||b1.City AS VARCHAR(100)),a1.R_Num+1

from City_Join a1,Recursive_Test_Par b1

WHERE a1.User_Name=b1.User_Name and a1.R_Num=b1.Rk_Num-1

)

SELECT a.User_name,a.City FROM City_Join a INNER JOIN

(SELECT User_Name,max(R_Num) R_Num from City_Join

GROUP BY User_Name) b

ON a.User_name=b.User_name and a.R_Num=b.R_Num;

--结果:

王五

北京

李四

杭州#广州

张三

杭州#郑州#南昌

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值