因为数据较大的原因,所以准备每周都删除一次,
用的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)
select memberid ,max(mprix )mprix ,convert(varchar(30),mdate 23)mdate
from a
group by memberid ,convert(varchar(30),mdate 23)
#4
要遍历整个表的会员字段吧
#5
为啥要遍历?本来可以直接操作啊
#6
以后在有数据插入会覆盖掉以前的么?或者替换掉?不会有数据有问题吧?
#7
在我的语句基础上加上where条件来控制每次要汇总的数据,这样就可以得到一个历史表
#8
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
首先,你的语句写法有问题,在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)
select memberid ,max(mprix )mprix ,convert(varchar(30),mdate 23)mdate
from a
group by memberid ,convert(varchar(30),mdate 23)
#4
要遍历整个表的会员字段吧
#5
为啥要遍历?本来可以直接操作啊
#6
以后在有数据插入会覆盖掉以前的么?或者替换掉?不会有数据有问题吧?
#7
在我的语句基础上加上where条件来控制每次要汇总的数据,这样就可以得到一个历史表
#8
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
首先,你的语句写法有问题,在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