请问一下,下面的sql语句是否有更高效的写法

wangandy2022 2022-08-07 20:36:05

declare @a int,@b int
set @a=(select 一月借 from 利润表 where 利润表项目='aaa')
set @b=(select 一月借 from 利润表 where 利润表项目='bbb')
update 利润表 set 一月借=@a+@b from 利润表 where 利润表项目='ccc'
 

...全文
174 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangandy2022 2022-08-08
  • 打赏
  • 举报
回复

我将明细表数据计算后,写入汇总表,汇总表中涉及很多纵向计算,想知道是否有更高效的方法完成对汇总表中相关数据的。

img

img

morliz子轩 2022-08-08
  • 举报
回复
@wangandy2022 你这个问题,核心点是在于每项,是不是有唯一的ID值,首要的是把需要计算的ID的公式方法编写到一张表里去。最后通过遍历这张表数据,去套每个计算ID的公式,再去遍历抽数据,进行计算。最后写到你要的目 标表字段列中。思路很重要
wangandy2022 2022-08-08
  • 举报
回复
@morliz子轩 谢谢,我再研究一下
shinger126 2022-08-08
  • 打赏
  • 举报
回复

;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 其他条件

shinger126 2022-08-08
  • 举报
回复 1
@shinger126 数据量大的话,先把利润计算出来,写到临时表,再创建索引和利润表关联更新
wangandy2022 2022-08-08
  • 举报
回复
@shinger126 谢谢回复
morliz子轩 2022-08-08
  • 打赏
  • 举报
回复

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

那么问题来了,你是想将每个子项月份的金额遍历出来,合计到子项上,按所有子项来相加,汇总到总项上。是不是这么个意思

wangandy2022 2022-08-08
  • 举报
回复
@morliz子轩 谢谢回复
shoppo0505 2022-08-08
  • 打赏
  • 举报
回复

就单个月来说,这个语句没有问题,效率是可以的,但是如果你要求多个月的话,根据你的表格设计,你需要对每个月,执行这一套设计,那效率就低了。
所以,表格的设计的话,不用把所有月份都列出来,只需要一个列,里面是月份值,然后用view输出你现在这个结构

wangandy2022 2022-08-08
  • 举报
回复
@shoppo0505 谢谢您的回复:是不是要把表结构改成 利润表项目 月份 金额 营业收入 1月 营业收入-租赁收入 1月 营业收入-其他收入 1月 营业成本 1月 营业成本-租赁成本 1月 营业成本-其他成本 1月 营业税金 1月 营业税金-租赁税金 1月 营业税金-其他税金 1月 营业利润 1月 营业收入 2月 营业收入-租赁收入 2月 营业收入-其他收入 2月 营业成本 2月 营业成本-租赁成本 2月 营业成本-其他成本 2月 营业税金 2月 营业税金-租赁税金 2月 营业税金-其他税金 2月 营业利润 2月
吉普赛的歌 版主 2022-08-07
  • 打赏
  • 举报
回复

这个效率并不差。
对于大表或并发高的表,提前查出来再更新,有助于减少不必要的锁。
奇怪的是项目C为什么=A+B

wangandy2022 2022-08-08
  • 举报
回复
@吉普赛的歌 我是用在利润表的纵向计算上的:declare @a int,@b int set @a=(select 一月借 from 利润表 where 利润表项目='营业收入-租赁收入') set @b=(select 一月借 from 利润表 where 利润表项目='营业收入-其他收入') update 利润表 set 一月借=@a+@b from 利润表 where 利润表项目='营业收入' 但我感觉这样写的话,还是比较麻烦,要写很多这样的语句,请问有没有什么更好的办法 利润表项目 1月 2月 3月 4月 5月 6月 12月 营业收入 营业收入-租赁收入 营业收入-其他收入 营业成本 营业成本-租赁成本 营业成本-其他成本 营业税金 营业税金-租赁税金 营业税金-其他税金 营业利润

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧