[MSSQL]SQL累加计算问题
2015-02-14 13:18
316 查看
我目前遇到如下两个问题:
1.目前我有一个表(Table1),如下所示:
日期 部门 姓名 当日业绩
2008-3-1 组1 张三 5000
2008-3-3 组1 张三 3000
2008-3-5 组1 张三 1000
2008-3-1 组2 李四 2000
2008-3-4 组2 李四 1500
2008-3-5 组2 李四 1200
2008-3-2 组1 王五 1000
2008-3-3 组1 王五 1300
2008-3-15 组1 王五 2800
2008-4-2 组1 张三 3000
2008-4-10 组1 张三 8000
2008-4-20 组1 张三 2000
2008-4-1 组2 李四 2500
2008-4-5 组2 李四 1800
2008-4-22 组2 李四 2200
2008-4-4 组1 王五 2400
2008-4-7 组1 王五 2600
2008-4-18 组1 王五 3300
我想按照日期、部门、人员算出每天、每人累计业绩是多少,也就是想得到下图的内容:
日期 部门 姓名 当日业绩 累计业绩
2008-3-1 组1 张三 5000 5000
2008-3-3 组1 张三 3000 8000
2008-3-5 组1 张三 1000 9000
2008-3-1 组2 李四 2000 2000
2008-3-4 组2 李四 1500 3500
2008-3-5 组2 李四 1200 4700
2008-3-2 组1 王五 1000 1000
2008-3-3 组1 王五 1300 2300
2008-3-15 组1 王五 2800 5100
2008-4-2 组1 张三 3000 3000
2008-4-10 组1 张三 8000 11000
2008-4-20 组1 张三 2000 13000
2008-4-1 组2 李四 2500 2500
2008-4-5 组2 李四 1800 4300
2008-4-22 组2 李四 2200 6500
2008-4-4 组1 王五 2400 2400
2008-4-7 组1 王五 2600 5000
2008-4-18 组1 王五 3300 8300
2.第二种情况正好和第一种情况相反,是已知每人每天的累计金额,求其每天的金额,已知表(Table2),内容如下表所示:
日期 部门 姓名 累计业绩
2008-3-1 组1 张三 5000
2008-3-3 组1 张三 5000
2008-3-5 组1 张三 5000
2008-3-1 组2 李四 2000
2008-3-4 组2 李四 3500
2008-3-5 组2 李四 4700
2008-3-2 组1 王五 1000
2008-3-3 组1 王五 2300
2008-3-15 组1 王五 2300
2008-4-2 组1 张三 3000
2008-4-10 组1 张三 3000
2008-4-20 组1 张三 5000
2008-4-1 组2 李四 2500
2008-4-5 组2 李四 4300
2008-4-22 组2 李四 6500
2008-4-4 组1 王五 2400
2008-4-7 组1 王五 5000
2008-4-18 组1 王五 5000
得到如下结果:
日期 部门 姓名 累计业绩 当天业绩
2008-3-1 组1 张三 5000 5000
2008-3-2 组1 张三 5000 0
2008-3-3 组1 张三 5000 0
2008-3-3 组2 李四 2000 2000
2008-3-4 组2 李四 3500 1500
2008-3-5 组2 李四 4700 1200
2008-3-10 组1 王五 1000 1000
2008-3-11 组1 王五 2300 1300
2008-3-12 组1 王五 2300 0
2008-4-2 组1 张三 3000 3000
2008-4-3 组1 张三 3000 0
2008-4-4 组1 张三 5000 2000
2008-4-1 组2 李四 2500 2500
2008-4-2 组2 李四 4300 1800
2008-4-3 组2 李四 6500 2200
2008-4-7 组1 王五 2400 2400
2008-4-8 组1 王五 5000 2600
2008-4-9 组1 王五 5000 0
请各位大虾指教!
——解决方案——————–
SQL code
select aaa.日期,aaa.部门,aaa.姓名,bbb.累计业绩,aaa.当天业绩
from table aaa inner join
(select 姓名,sum(当天业绩) as 累计业绩 from table group by 姓名) bbb on a.姓名=b.姓名
——解决方案——————–
先贴第一种情况
SQL code– 生成测试数据
declare @table table(日期 datetime,部门 nvarchar(50),姓名 nvarchar(50),当天业绩 int)
insert into @table
select ‘2008-3-1’,N’组1’,N’张三’ ,’5000’
union
select ‘2008-3-1’ , N’组1’ , N’张三’ , ’ 5000 ’
union
select ‘2008-3-3’ , N’组1’ , N’张三’ , ’ 3000 ’
union
select ‘2008-3-5’ , N’组1’ , N’张三’ , ‘1000’
union
select ‘2008-4-1’ , N’组2’ , N’李四’ , ‘2500’
union
select ‘2008-4-5’ , N’组2’ , N’李四’ , ‘1800’
union
select ‘2008-4-22’ , N’组2’ , N’李四’ , ’ 2200’
–得出结果
select tb1.日期
,tb1.部门
,tb1.姓名
,tb1.当天业绩
,(select
sum(tb2.当天业绩)
from
@table tb2
where
tb2.日期<=tb1.日期
from
@table tb1
–结果
– 2008-03-01 00:00:00.000 组1 张三 5000 5000
– 2008-03-03 00:00:00.000 组1 张三 3000 8000
– 2008-03-05 00:00:00.000 组1 张三 1000 9000
– 2008-04-01 00:00:00.000 组2 李四 2500 11500
– 2008-04-05 00:00:00.000 组2 李四 1800 13300
– 2008-04-22 00:00:00.000 组2 李四 2200 15500
——解决方案——————–
SQL code
–借数据
declare @table table(日期 datetime,部门 nvarchar(50),姓名 nvarchar(50),当天业绩 int)
insert into @table
select ‘2008-3-1’,N’组1’,N’张三’ ,’5000’
union
select ‘2008-3-2’ , N’组1’ , N’张三’ , ’ 5000 ’
union
select ‘2008-3-3’ , N’组1’ , N’张三’ , ’ 3000 ’
union
select ‘2008-3-5’ , N’组1’ , N’张三’ , ‘1000’
union
select ‘2008-4-1’ , N’组2’ , N’李四’ , ‘2500’
union
select ‘2008-4-5’ , N’组2’ , N’李四’ , ‘1800’
union
select ‘2008-4-22’ , N’组2’ , N’李四’ , ’ 2200’
select *,累计业绩=(select sum(当天业绩) from @table b where a.部门=b.部门 and a.姓名=b.姓名 and b.日期<=a.日期) from @table a
——解决方案——————–
1.
SQL code
/[b]********************************************************************[/b]/
/回复:20080519008总:00028 /
/主题:求累计 /
/作者:二等草 /
/[b]********************************************************************[/b]/
set nocount on
–数据————————————–
declare @tb table([日期] datetime,[部门] varchar(3),[姓名] varchar(4),[当日业绩] int)
insert into @tb select ‘2008-3-1’,’组1’,’张三’,5000
insert into @tb select ‘2008-3-3’,’组1’,’张三’,3000
insert into @tb select ‘2008-3-5’,’组1’,’张三’,1000
insert into @tb select ‘2008-3-1’,’组2’,’李四’,2000
insert into @tb select ‘2008-3-4’,’组2’,’李四’,1500
insert into @tb select ‘2008-3-5’,’组2’,’李四’,1200
insert into @tb select ‘2008-3-2’,’组1’,’王五’,1000
insert into @tb select ‘2008-3-3’,’组1’,’王五’,1300
insert into @tb select ‘2008-3-15’,’组1’,’王五’,2800
insert into @tb select ‘2008-4-2’,’组1’,’张三’,3000
insert into @tb select ‘2008-4-10’,’组1’,’张三’,8000
insert into @tb select ‘2008-4-20’,’组1’,’张三’,2000
insert into @tb select ‘2008-4-1’,’组2’,’李四’,2500
insert into @tb select ‘2008-4-5’,’组2’,’李四’,1800
insert into @tb select ‘2008-4-22’,’组2’,’李四’,2200
insert into @tb select ‘2008-4-4’,’组1’,’王五’,2400
insert into @tb select ‘2008-4-7’,’组1’,’王五’,2600
insert into @tb select ‘2008-4-18’,’组1’,’王五’,3300
–代码————————————–
select *,累计=0 into # from @tb order by convert(char(7),日期,120),姓名 desc
declare @i int,@xm1 varchar(10),@xm2 varchar(10)
select @xm1 = ”,@xm2=”
update # set 累计=@i,@xm2 = @xm1,@i=case when @xm2 = 姓名 then @i+当日业绩 else 当日业绩 end,@xm1=姓名
select * from #
drop table #
go
/*结果————————————–
日期 部门 姓名 当日业绩 累计
2008-03-01 00:00:00.000 组1 张三 5000 5000
2008-03-03 00:00:00.000 组1 张三 3000 8000
2008-03-05 00:00:00.000 组1 张三 1000 9000
2008-03-02 00:00:00.000 组1 王五 1000 1000
2008-03-03 00:00:00.000 组1 王五 1300 2300
2008-03-15 00:00:00.000 组1 王五 2800 5100
2008-03-04 00:00:00.000 组2 李四 1500 1500
2008-03-05 00:00:00.000 组2 李四 1200 2700
2008-03-01 00:00:00.000 组2 李四 2000 4700
2008-04-02 00:00:00.000 组1 张三 3000 3000
2008-04-10 00:00:00.000 组1 张三 8000 11000
2008-04-20 00:00:00.000 组1 张三 2000 13000
2008-04-04 00:00:00.000 组1 王五 2400 2400
2008-04-07 00:00:00.000 组1 王五 2600 5000
2008-04-18 00:00:00.000 组1 王五 3300 8300
2008-04-22 00:00:00.000 组2 李四 2200 2200
2008-04-01 00:00:00.000 组2 李四 2500 4700
2008-04-05 00:00:00.000 组2 李四 1800 6500
–清除————————————*/
1.目前我有一个表(Table1),如下所示:
日期 部门 姓名 当日业绩
2008-3-1 组1 张三 5000
2008-3-3 组1 张三 3000
2008-3-5 组1 张三 1000
2008-3-1 组2 李四 2000
2008-3-4 组2 李四 1500
2008-3-5 组2 李四 1200
2008-3-2 组1 王五 1000
2008-3-3 组1 王五 1300
2008-3-15 组1 王五 2800
2008-4-2 组1 张三 3000
2008-4-10 组1 张三 8000
2008-4-20 组1 张三 2000
2008-4-1 组2 李四 2500
2008-4-5 组2 李四 1800
2008-4-22 组2 李四 2200
2008-4-4 组1 王五 2400
2008-4-7 组1 王五 2600
2008-4-18 组1 王五 3300
我想按照日期、部门、人员算出每天、每人累计业绩是多少,也就是想得到下图的内容:
日期 部门 姓名 当日业绩 累计业绩
2008-3-1 组1 张三 5000 5000
2008-3-3 组1 张三 3000 8000
2008-3-5 组1 张三 1000 9000
2008-3-1 组2 李四 2000 2000
2008-3-4 组2 李四 1500 3500
2008-3-5 组2 李四 1200 4700
2008-3-2 组1 王五 1000 1000
2008-3-3 组1 王五 1300 2300
2008-3-15 组1 王五 2800 5100
2008-4-2 组1 张三 3000 3000
2008-4-10 组1 张三 8000 11000
2008-4-20 组1 张三 2000 13000
2008-4-1 组2 李四 2500 2500
2008-4-5 组2 李四 1800 4300
2008-4-22 组2 李四 2200 6500
2008-4-4 组1 王五 2400 2400
2008-4-7 组1 王五 2600 5000
2008-4-18 组1 王五 3300 8300
2.第二种情况正好和第一种情况相反,是已知每人每天的累计金额,求其每天的金额,已知表(Table2),内容如下表所示:
日期 部门 姓名 累计业绩
2008-3-1 组1 张三 5000
2008-3-3 组1 张三 5000
2008-3-5 组1 张三 5000
2008-3-1 组2 李四 2000
2008-3-4 组2 李四 3500
2008-3-5 组2 李四 4700
2008-3-2 组1 王五 1000
2008-3-3 组1 王五 2300
2008-3-15 组1 王五 2300
2008-4-2 组1 张三 3000
2008-4-10 组1 张三 3000
2008-4-20 组1 张三 5000
2008-4-1 组2 李四 2500
2008-4-5 组2 李四 4300
2008-4-22 组2 李四 6500
2008-4-4 组1 王五 2400
2008-4-7 组1 王五 5000
2008-4-18 组1 王五 5000
得到如下结果:
日期 部门 姓名 累计业绩 当天业绩
2008-3-1 组1 张三 5000 5000
2008-3-2 组1 张三 5000 0
2008-3-3 组1 张三 5000 0
2008-3-3 组2 李四 2000 2000
2008-3-4 组2 李四 3500 1500
2008-3-5 组2 李四 4700 1200
2008-3-10 组1 王五 1000 1000
2008-3-11 组1 王五 2300 1300
2008-3-12 组1 王五 2300 0
2008-4-2 组1 张三 3000 3000
2008-4-3 组1 张三 3000 0
2008-4-4 组1 张三 5000 2000
2008-4-1 组2 李四 2500 2500
2008-4-2 组2 李四 4300 1800
2008-4-3 组2 李四 6500 2200
2008-4-7 组1 王五 2400 2400
2008-4-8 组1 王五 5000 2600
2008-4-9 组1 王五 5000 0
请各位大虾指教!
——解决方案——————–
SQL code
select aaa.日期,aaa.部门,aaa.姓名,bbb.累计业绩,aaa.当天业绩
from table aaa inner join
(select 姓名,sum(当天业绩) as 累计业绩 from table group by 姓名) bbb on a.姓名=b.姓名
——解决方案——————–
先贴第一种情况
SQL code– 生成测试数据
declare @table table(日期 datetime,部门 nvarchar(50),姓名 nvarchar(50),当天业绩 int)
insert into @table
select ‘2008-3-1’,N’组1’,N’张三’ ,’5000’
union
select ‘2008-3-1’ , N’组1’ , N’张三’ , ’ 5000 ’
union
select ‘2008-3-3’ , N’组1’ , N’张三’ , ’ 3000 ’
union
select ‘2008-3-5’ , N’组1’ , N’张三’ , ‘1000’
union
select ‘2008-4-1’ , N’组2’ , N’李四’ , ‘2500’
union
select ‘2008-4-5’ , N’组2’ , N’李四’ , ‘1800’
union
select ‘2008-4-22’ , N’组2’ , N’李四’ , ’ 2200’
–得出结果
select tb1.日期
,tb1.部门
,tb1.姓名
,tb1.当天业绩
,(select
sum(tb2.当天业绩)
from
@table tb2
where
tb2.日期<=tb1.日期
) as 累计业绩
from
@table tb1
–结果
– 2008-03-01 00:00:00.000 组1 张三 5000 5000
– 2008-03-03 00:00:00.000 组1 张三 3000 8000
– 2008-03-05 00:00:00.000 组1 张三 1000 9000
– 2008-04-01 00:00:00.000 组2 李四 2500 11500
– 2008-04-05 00:00:00.000 组2 李四 1800 13300
– 2008-04-22 00:00:00.000 组2 李四 2200 15500
——解决方案——————–
SQL code
–借数据
declare @table table(日期 datetime,部门 nvarchar(50),姓名 nvarchar(50),当天业绩 int)
insert into @table
select ‘2008-3-1’,N’组1’,N’张三’ ,’5000’
union
select ‘2008-3-2’ , N’组1’ , N’张三’ , ’ 5000 ’
union
select ‘2008-3-3’ , N’组1’ , N’张三’ , ’ 3000 ’
union
select ‘2008-3-5’ , N’组1’ , N’张三’ , ‘1000’
union
select ‘2008-4-1’ , N’组2’ , N’李四’ , ‘2500’
union
select ‘2008-4-5’ , N’组2’ , N’李四’ , ‘1800’
union
select ‘2008-4-22’ , N’组2’ , N’李四’ , ’ 2200’
select *,累计业绩=(select sum(当天业绩) from @table b where a.部门=b.部门 and a.姓名=b.姓名 and b.日期<=a.日期) from @table a
——解决方案——————–
1.
SQL code
/[b]********************************************************************[/b]/
/回复:20080519008总:00028 /
/主题:求累计 /
/作者:二等草 /
/[b]********************************************************************[/b]/
set nocount on
–数据————————————–
declare @tb table([日期] datetime,[部门] varchar(3),[姓名] varchar(4),[当日业绩] int)
insert into @tb select ‘2008-3-1’,’组1’,’张三’,5000
insert into @tb select ‘2008-3-3’,’组1’,’张三’,3000
insert into @tb select ‘2008-3-5’,’组1’,’张三’,1000
insert into @tb select ‘2008-3-1’,’组2’,’李四’,2000
insert into @tb select ‘2008-3-4’,’组2’,’李四’,1500
insert into @tb select ‘2008-3-5’,’组2’,’李四’,1200
insert into @tb select ‘2008-3-2’,’组1’,’王五’,1000
insert into @tb select ‘2008-3-3’,’组1’,’王五’,1300
insert into @tb select ‘2008-3-15’,’组1’,’王五’,2800
insert into @tb select ‘2008-4-2’,’组1’,’张三’,3000
insert into @tb select ‘2008-4-10’,’组1’,’张三’,8000
insert into @tb select ‘2008-4-20’,’组1’,’张三’,2000
insert into @tb select ‘2008-4-1’,’组2’,’李四’,2500
insert into @tb select ‘2008-4-5’,’组2’,’李四’,1800
insert into @tb select ‘2008-4-22’,’组2’,’李四’,2200
insert into @tb select ‘2008-4-4’,’组1’,’王五’,2400
insert into @tb select ‘2008-4-7’,’组1’,’王五’,2600
insert into @tb select ‘2008-4-18’,’组1’,’王五’,3300
–代码————————————–
select *,累计=0 into # from @tb order by convert(char(7),日期,120),姓名 desc
declare @i int,@xm1 varchar(10),@xm2 varchar(10)
select @xm1 = ”,@xm2=”
update # set 累计=@i,@xm2 = @xm1,@i=case when @xm2 = 姓名 then @i+当日业绩 else 当日业绩 end,@xm1=姓名
select * from #
drop table #
go
/*结果————————————–
日期 部门 姓名 当日业绩 累计
2008-03-01 00:00:00.000 组1 张三 5000 5000
2008-03-03 00:00:00.000 组1 张三 3000 8000
2008-03-05 00:00:00.000 组1 张三 1000 9000
2008-03-02 00:00:00.000 组1 王五 1000 1000
2008-03-03 00:00:00.000 组1 王五 1300 2300
2008-03-15 00:00:00.000 组1 王五 2800 5100
2008-03-04 00:00:00.000 组2 李四 1500 1500
2008-03-05 00:00:00.000 组2 李四 1200 2700
2008-03-01 00:00:00.000 组2 李四 2000 4700
2008-04-02 00:00:00.000 组1 张三 3000 3000
2008-04-10 00:00:00.000 组1 张三 8000 11000
2008-04-20 00:00:00.000 组1 张三 2000 13000
2008-04-04 00:00:00.000 组1 王五 2400 2400
2008-04-07 00:00:00.000 组1 王五 2600 5000
2008-04-18 00:00:00.000 组1 王五 3300 8300
2008-04-22 00:00:00.000 组2 李四 2200 2200
2008-04-01 00:00:00.000 组2 李四 2500 4700
2008-04-05 00:00:00.000 组2 李四 1800 6500
–清除————————————*/
相关文章推荐
- 一条有关计算奇偶数的问题(SQL)
- T-SQL中计算排名问题(考试成绩视图)
- “The SQL Server license agreenment cannot be located for the selected edition.”MSSQL安装问题
- 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)
- 在论坛中出现的比较难的sql问题:35(时间间隔计算问题)
- ORACLE与MSSQL计算时间差的SQL操作
- SQL直接计算年龄问题
- 【Transact-SQL】一个计算用电量的问题
- 【Transact-SQL】一个计算用电量的问题
- mssql插件直接执行sql语句取出时间存在时差的问题
- 求救!胜负比率计算问题?如何用SQL语句实现?(存储过程也可以)
- SQL SERVER bitmask计算 以及溢出问题
- Microsoft SQL server 2000 安装挂起 mssql 2000 挂起无法安装的问题
- 有关SQL中的计算问题
- Sql 区分大小写问题(针对的是MSSQL)
- SQL技巧:利用阶梯式累加进行累计数量的计算
- MSSQL计算sql语句运行时间
- sql 计算驾驶超时时间问题
- [MSSQL2008]Spatial Data in SQL Server 2008 - 根据经纬度计算两点间距离
- 解决MSSQL 无法解决 equal to 操作中 "SQL_Latin1_General_CP1_CI_AS" 和 "Chinese_PRC_CI_AS" 之间的排序规则冲突 问题