在Sql2005以上的版本提供了With 关键字的以实现的递归的应用。同时,在sum(字段) over(partition by 字段1)也有着比较多的应用范围。
在这里以一个客户的销售记录为基础的应用,以便计算出累计与合计
数据例表如下:
create table SaleRecord
(
cCusName varchar(1), /*客户名称*/
m int, /*月份*/
imoney money /*金额*/
)
数据范例如下:
数据显示要求:按月,按客户体现当月金额,累计金额以及总计金额
with Record as (
select m,ccusname,imoney,imoney as lj
from salerecord where m=1
/*数据初始*/
union all
select sr.m,sr.ccusname,sr.imoney,sr.imoney+r.lj from record r
inner join salerecord sr on r.m+1=sr.m and r.ccusname=sr.ccusname
/*其它月份,特别是sr.imoney+r.lj进行累计*/
)
select M,CCUSNAME,
SUM(IMONEY) OVER (PARTITION BY M,CCUSNAME) AS IMONEY,/*当月金额*/
lj,/*累计金额*/
SUM(IMONEY) OVER (PARTITION BY CCUSNAME) AS TOTAL /*总计金额*/
from Record ORDER BY CCUSNAME,M
效果
这种方式较为方便,灵活应用可以形成更为丰富地应用效果。同时,With形成的递归中不能进行乘法运算;在递归过程中,支持变量与常量的累计;
这种方式在SqlServer 2005以上版本支持。