mssql如何计算某个表的字段总和

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

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

11 个解决方案

#1


直接SUM求和就可以了吧 有什么问题?

#2


INSERT INTO B
SELECT *
FROM A

#3


删除前,先把这个结果插入一个表中作为记录,然后再删除
select memberid ,max(mprix )mprix ,convert(varchar(30),mdate 23)mdate 
from a
group by memberid ,convert(varchar(30),mdate 23)

#4


引用 1 楼 fredrickhu 的回复:
直接SUM求和就可以了吧 有什么问题?


要遍历整个表的会员字段吧

#5


为啥要遍历?本来可以直接操作啊

#6


引用 2 楼 chen357313771 的回复:
INSERT INTO B
SELECT *
FROM A


以后在有数据插入会覆盖掉以前的么?或者替换掉?不会有数据有问题吧?

#7


在我的语句基础上加上where条件来控制每次要汇总的数据,这样就可以得到一个历史表

#8


引用 7 楼 DBA_Huangzj 的回复:
在我的语句基础上加上where条件来控制每次要汇总的数据,这样就可以得到一个历史表


insert into B select * from A where DateDiff(day,moutdate,getdate())>7
可以这样么?然后在删除
delete from memberprixlist where DateDiff(day,moutdate,getdate())>7
这样可以得到一个历史表吧?

#9


然后以后要求总和在直接select 用sum

#10


如果你在“插入”B表后再汇总,那要多做很多事情,我个人比较偏向先汇总,插入B表,然后用你的DELTE语句删除不要的数据。

#11


先汇总,再插入啊

首先,你的语句写法有问题,在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


 

#1


直接SUM求和就可以了吧 有什么问题?

#2


INSERT INTO B
SELECT *
FROM A

#3


删除前,先把这个结果插入一个表中作为记录,然后再删除
select memberid ,max(mprix )mprix ,convert(varchar(30),mdate 23)mdate 
from a
group by memberid ,convert(varchar(30),mdate 23)

#4


引用 1 楼 fredrickhu 的回复:
直接SUM求和就可以了吧 有什么问题?


要遍历整个表的会员字段吧

#5


为啥要遍历?本来可以直接操作啊

#6


引用 2 楼 chen357313771 的回复:
INSERT INTO B
SELECT *
FROM A


以后在有数据插入会覆盖掉以前的么?或者替换掉?不会有数据有问题吧?

#7


在我的语句基础上加上where条件来控制每次要汇总的数据,这样就可以得到一个历史表

#8


引用 7 楼 DBA_Huangzj 的回复:
在我的语句基础上加上where条件来控制每次要汇总的数据,这样就可以得到一个历史表


insert into B select * from A where DateDiff(day,moutdate,getdate())>7
可以这样么?然后在删除
delete from memberprixlist where DateDiff(day,moutdate,getdate())>7
这样可以得到一个历史表吧?

#9


然后以后要求总和在直接select 用sum

#10


如果你在“插入”B表后再汇总,那要多做很多事情,我个人比较偏向先汇总,插入B表,然后用你的DELTE语句删除不要的数据。

#11


先汇总,再插入啊

首先,你的语句写法有问题,在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