日期:2014-05-17  浏览次数:20709 次

mssql如何计算某个表的字段总和
有表A 里面有字段(memberid 会员帐号)(mprix 积分)(mdate 时间)
因为数据较大的原因,所以准备每周都删除一次,
用的delete from A where DateDiff(day,mdate,getdate())>7  来删除以前的数据,
但是,我需要统计这个会员的总的积分
设置了表B  里面有字段(memberid 会员帐号)(mprixsum 积分)

我建立了一个维护计划。想问t-sql语句怎么写能遍历整个A表的信息插入到B表内?

------解决方案--------------------
INSERT INTO B
SELECT *
FROM A

------解决方案--------------------
删除前,先把这个结果插入一个表中作为记录,然后再删除
select memberid ,max(mprix )mprix ,convert(varchar(30),mdate 23)mdate 
from a
group by memberid ,convert(varchar(30),mdate 23)
------解决方案--------------------
为啥要遍历?本来可以直接操作啊
------解决方案--------------------
先汇总,再插入啊

首先,你的语句写法有问题,在mdate上使用datediff,那么mdate上 有索引也无法使用
其次,不需要查询整个A表统计,统计方法有问题

可以按照以下方式做,基本上大数据的不是动态的报表都可以这样做

设定一个统计频率,例如每天统计一次,那么每次就需要计算这一天内的数据,然后把统计结果根据会员账号更新到B表。下次计算又从上一次统计的结束时间开始,那么就不会漏掉统计。
--定义起止时间并赋值
declare @sDate varchar(10)
declare @eDate varchar(10)
select @sDate=convert(varchar,getdate()-1,111),@eDate=convert(varchar,getdate(),111)
--计算起止时间内的会员积分数据
select memberid,sum(mprix) as mprix into #tmp from A where mdate between @sdate and @edate group by memberid
--插入之前没有积分的会员数据
insert into B select * from #tmp t where not exists(select 0 from B where t.memberid=B.memberid)
--更新之前已有积分的会员数据
update B set B.mprixsum=B.mprixsum+t.mprix from B join #tmp t on B.memberid=t.memberid