SQl中WITH与sum的小秘密!

在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以上版本支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值