34,837
社区成员




declare @a int,@b int
set @a=(select 一月借 from 利润表 where 利润表项目='aaa')
set @b=(select 一月借 from 利润表 where 利润表项目='bbb')
update 利润表 set 一月借=@a+@b from 利润表 where 利润表项目='ccc'
我将明细表数据计算后,写入汇总表,汇总表中涉及很多纵向计算,想知道是否有更高效的方法完成对汇总表中相关数据的。
;with t as (select sum(一月借) as 一月借,sum(二月借) as 二月借,...sum(十二月借) as 十二月借 from 利润表
where 利润表项目 in ('aaa','bbb') and 其他条件)
update a set a.一月借=t.一月借,
....
a.十二月借=t.十二月借
from 利润表 a join t on 1=1 and 其他条件
where a.利润表项目='ccc'
and 其他条件
Demo:
--参数条件
declare @ProjectA nvarchar(60) = '营业利润' -总项
@ProjectB nvarchar(60) = 营业利润-XXXX' --项1
@ProjectC nvarchar(60) = 营业利润-XXXX' --项2
--变量体
declare @a decimal(18,6),
@b decimal(18,6)
if isnull(@ProjectNa,'') !=''
begin
set @a = (select 一月借 from 利润表 where 利润表项目= @ProjectB)
set @b=(select 一月借 from 利润表 where 利润表项目= @ProjectC)
end
if isnull(@a,0) >0 and isnull(@b,0) >0
begin
update 利润表 set 一月借=@a+@b from 利润表 where 利润表项目= @ProjectNa
end
那么问题来了,你是想将每个子项月份的金额遍历出来,合计到子项上,按所有子项来相加,汇总到总项上。是不是这么个意思
就单个月来说,这个语句没有问题,效率是可以的,但是如果你要求多个月的话,根据你的表格设计,你需要对每个月,执行这一套设计,那效率就低了。
所以,表格的设计的话,不用把所有月份都列出来,只需要一个列,里面是月份值,然后用view输出你现在这个结构
这个效率并不差。
对于大表或并发高的表,提前查出来再更新,有助于减少不必要的锁。
奇怪的是项目C为什么=A+B