sql进行数据累加

比如有这样一个需求,一张表格(User_Salary)包含每个人(UserName)每个月份(Month)发的薪水(Salary)

求这样一个结果集:每个人每月所发薪水及累计所得薪水和,如下表

UserNameMonthSalary
AAA2010/121000
AAA2011/012000
AAA2011/023000
BBB2010/122000
BBB2011/012500
BBB2011/022500

结果

UserNameMonthSalaryCumulation
AAA2010/1210001000
AAA2011/0120003000
AAA2011/0230006000
BBB2010/1220002000
BBB2011/0125004500
BBB2011/0225007000

当然这个结果在Excel中十分好实现,只需要一个公式就好:

image

注意G2的公式一定要保持第一个列不动所以就是$F$2:F2,然后向下拖一下就可以,但是,这只适用于数据固定的情况下,试想,如果有100个员工的数据,岂不是要拖100下。当然也可能有其他办法,这个我就不知道了。

下面,如果用sql实现能有什么办法呢?首先想到的是游标。

对游标的确可以实现,写程序也可以实现,因为他们的思想是一样的:判断一下名字是不是已经遍历过了,如果遍历过了,就累加一下,如果没有就从0加起。这样很好理解,但是写的很费时,其实一条sql语句就可以实现的,那就是子查询。

create table User_Salary (UserName nvarchar(200), Month nvarchar(20), Salary int)

go

insert into User_Salary (UserName,Month,Salary ) values('AAA','2010/12',1000)
insert into User_Salary (UserName,Month,Salary ) values('AAA','2011/01',2000)
insert into User_Salary (UserName,Month,Salary ) values('AAA','2011/02',3000)
insert into User_Salary (UserName,Month,Salary ) values('BBB','2010/12',2000)
insert into User_Salary (UserName,Month,Salary ) values('BBB','2011/01',2500)
insert into User_Salary (UserName,Month,Salary ) values('BBB','2011/02',2500)
go

select * from User_Salary
go

select UserName,Month,Salary,
 Cummulation=(
  select SUM(Salary)
  from
   User_Salary i
   where i.UserName=o.UserName and i.Month<=o.Month)
from User_Salary o
order by 1,2

select
 A.UserName,A.Month,MAX(A.Salary) as Salary,SUM (B.Salary) as Accumulation
from
 User_Salary A
inner join
 User_Salary B
ON
 A.UserName = B.UserName
where
 B.Month <= A.Month
group by
 A.UserName,A.Month
order by 
 A.UserName,A.Month

这样用联合的方式就好理解一些,其实这样就是把每一行对应比他月份小的值分成一组,然后进行运算,如果这样不明白,那么下面的sql会使这个查询更加好理解:

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/kuang/archive/2012/07/19/2599320.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值