热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

请帮忙修改下存储过程的循环语句

CREATEPROCEDUREsp_ArrearageRate@DayCountint,@EndDatevarchar(10),@Typeint,@OutputTypeint,@Em
CREATE PROCEDURE sp_ArrearageRate @DayCount int ,@EndDate varchar(10),@Type int,@OutputType int ,@EmployeeID varchar(10),@GuestNo varchar(10),@cb varchar(4),@SelectDate varchar(10),@SubPrice numeric(10,4) AS

set @DayCount = @DayCount - 1

if @Type  = 1
begin


if exists(select * from dbo.sysobjects where id = object_id(N'[SaveMoney]') and objectproperty(id,N'IsUserTable') = 1)
drop table SaveMoney


declare @i int
set @i = 0

while @i <= @DayCount
begin
select 
out_no,
b.outcb as cb,
Round(sum(s_amt),4)  as inamt   
into #t1  
from accrecv as a,accrecvde as b 
where 
a.sn=b.sn and 
a.falg =1 and 
a.r_date <= convert(datetime,@EndDate)
group by out_no,b.outcb

select 
a.out_no,
a.cb,
a.out_date,
a.out_emp,
a.out_dept,
round(sum(b.out_qty*b.out_price),4) as amt   
into #t2 
from mtlout as a ,mtloutde as b 
where 
a.outid=b.outid and 
a.out_type='F08' and 
a.out_flag =1 and
a.out_date <= convert(datetime,@EndDate)
group by a.out_no,a.cb,a.out_date,a.out_emp,a.out_dept

select 
out_no,
b.outcb as cb,
edate ,
Round(sum(s_amt),4)  as inamt   
into #t41  
from accrecv as a,accrecvde as b 
where 
a.sn=b.sn and 
a.falg =1 and 
a.r_date <= convert(datetime,@EndDate)  and  
a.edate > convert(datetime,@EndDate)
group by out_no,b.outcb,edate

select 
out_no,
cb,
sum(inamt) as inamt ,
(select top 1  edate from #t41 as a where a.out_no=b.out_no order by edate desc ) as edate 
into #t4  
from #t41 as b 
group by out_no,cb

select 
a.*,
isnull(b.inamt,0) as inamt  ,
round(isnull(a.amt,0)- isnull(b.inamt,0) ,2) as notamt 
into #t3 
from #t2 as a,#t1 as b 
where a.out_no *=b.out_no and a.cb*=b.cb

select 
a.*,
isnull(b.inamt,0) as qpinamt , 
round(notamt+isnull(b.inamt,0) ,2) as qpnotamt,
isnull(b.edate,null ) as edate   
into #t5 
from #t3 as a, #t4 as b 
where a.out_no*=b.out_no and a.cb*=b.cb

delete  from #t5 
where notamt =0 and  qpnotamt=0

if @i = 0
begin
select
@EndDate as ArrearageDate,
#t5.*
into Arrearage
from #t5 
end
else
begin
insert Arrearage
select 
@EndDate,
#t5.*
from #t5
end drop table #t1
drop table #t2
drop table #t3
drop table #t41
drop table #t4
drop table #t5


select 
* ,
(case when charindex('現金',out_type)<>0 then amt else 0 end) as xjamt,
(case when charindex('現金',out_type)=0 then amt else 0 end) as pjamt
into #t81 
from accrecv 
where 
charindex('預收',out_lb)<>0  and 
edate <= convert(datetime,@EndDate)

select 
* ,
(case when charindex('退票',o_remark)=0 and  charindex('現金',out_type)<>0 then -(amt) else 0 end) as xjamt ,
                 (case when charindex('退票',o_remark)=0 and charindex('現金',out_type)=0   then -(amt) else 0 end) as pjamt ,
                 (case when charindex('退票',o_remark)<>0   then (amt) else 0 end) as tpamt  
into #t82 
from accrecv 
where 
use_jy=1  AND  o_remark<>'退票' and
edate <= convert(datetime,@EndDate)

insert #t82
select 
* ,
(case when charindex('退票',o_remark)=0 and  charindex('現金',out_type)<>0 then (amt) else 0 end) as xjamt ,
                 (case when charindex('退票',o_remark)=0 and charindex('現金',out_type)=0   then (amt) else 0 end) as pjamt ,
                 (case when charindex('退票',o_remark)<>0   then (amt) else 0 end) as tpamt 
 from accrecv 
where 
use_jy=0 and   
( charindex('3.預收款',out_lb)<>0 and o_remark='退票') and
edate <= convert(datetime,@EndDate)

update #t81 set r_remark =(select shotname from mtlguest  as a where a.guestno=#t81.guest_no)
update #t82 set r_remark =(select shotname from mtlguest  as a where a.guestno=#t82.guest_no)

select 
guest_no,
r_remark,
cb,
edate,
sum( (amt))  as ystotamt,
sum(pjamt) as yspjamt  ,
sum(xjamt) as ysxjamt 
into #t83  
from #t81  
group by guest_no,r_remark,cb,edate

select 
guest_no,
r_remark,
cb,
edate,
sum(case when charindex('退票',o_remark)<>0 then 0 else abs(amt) end )  as ystotamt,
sum(pjamt) as yspjamt  ,
sum(xjamt) as ysxjamt ,
sum(tpamt) as tpamt  
into #t84 
from  #t82  
group by guest_no,r_remark,cb,edate

select guest_no,r_remark,cb,edate into #t85 from #t83
union
select guest_no,r_remark,cb,edate from #t84
 
SELECT 
* , 
isnull((SELECT ystotamt FROM #t83 AS B where b.guest_no=a.guest_no and b.cb = a.cb and b.edate = a.edate),0) as ystotamt,
                    isnull((SELECT yspjamt FROM #t83 AS B where b.guest_no=a.guest_no and b.cb = a.cb and b.edate = a.edate),0) as yspjamt,
                    isnull((SELECT ysxjamt FROM #t83 AS B where b.guest_no=a.guest_no and b.cb = a.cb and b.edate = a.edate),0) as ysxjamt,

                  isnull((SELECT ystotamt FROM #t84 AS B where b.guest_no=a.guest_no and b.cb = a.cb and b.edate = a.edate),0) as o_totamt,
                    isnull((SELECT yspjamt  FROM #t84 AS B where b.guest_no=a.guest_no and b.cb = a.cb and b.edate = a.edate),0) as opj,
                  isnull((SELECT ysxjamt  FROM #t84 AS B where b.guest_no=a.guest_no and b.cb = a.cb and b.edate = a.edate),0) as oxj,
                    isnull((SELECT tpamt      FROM #t84 AS B where b.guest_no=a.guest_no and b.cb = a.cb and b.edate = a.edate),0) as otp   into  #t86
  FROM #t85  AS A 

if @i = 0 
begin
select
@EndDate as EndDate, 
*,
ystotamt-otp-o_totamt as ye  ,
isnull((
select top 1 
d.emp_no
from (select guest_no,emp_no,bdate,isnull(edate,convert(datetime,'2078-12-31')) as edate,cb from mtlguestye) as d
where 
d.guest_no = #t86.guest_no and
d.cb = #t86.cb and
convert(varchar(10),d.bdate,21) <= @EndDate and
convert(varchar(10), d.edate,21) >= @EndDate and
convert(varchar(10),d.bdate,21) <= #t86.edate and
convert(varchar(10),d.edate,21) >= #t86.edate
order by d.bdate desc
),'') as SaveMoneyEmployee
into SaveMoney  
from #t86  
where ystotamt-otp-o_totamt <>0  
end
else
begin
insert SaveMoney    ----------怎么设这个条件.主要是循环的那个时间..
select 
@EndDate,
*,
ystotamt-otp-o_totamt as ye  ,
isnull((
select top 1 
d.emp_no  
from (select guest_no,emp_no,bdate,isnull(edate,convert(datetime,'2078-12-31')) as edate,cb from mtlguestye) as d
where 
d.guest_no = #t86.guest_no and
d.cb = #t86.cb and
convert(varchar(10),d.bdate,21) <= @EndDate and
convert(varchar(10), d.edate,21) >= @EndDate and
convert(varchar(10),d.bdate,21) <= #t86.edate and
convert(varchar(10),d.edate,21) >= #t86.edate
order by d.bdate desc
),'') as SaveMoneyEmployee
from #t86  
where ystotamt-otp-o_totamt <>0  
end
update SaveMoney set otp=-otp where EndDate = @EndDate

drop table #t81
drop table #t82
drop table #t83
drop table #t84
drop table #t85
drop table #t86

set @i = @i + 1
set @EndDate = convert(varchar(10),convert(datetime,@EndDate) - 1,21)
end
end


每次计算都会把以前的数据删掉重新算,好长时间.我想取最近的一个月的数值开始算.怎么在insert上设条件/..高手帮忙啊

34 个解决方案

#1


       看到那么长都怕了,还是等高手

#2


不是吧没人

#3


光贴个代码,也不说需求和问题
让别人怎么改?

#4


好多select 语句
好多临时表

#5


每次计算都会把以前的数据删掉重新算,好长时间.我想取最近的一个月的数值开始算.怎么在insert上设条件/..高手帮忙啊

#6


代码太长了 不要动不动就这么长的代码啊 

#7


我的也很长,很头疼,一直想优化

#8


就是一些临时表啊.老大们,帮帮手啦..

#9


看不懂,那么长!也不知道是什么意思!

#10


太长了,没法看,想办法简短一点吧

#11



路过~~~~~
友情up~~~~~~~~

#12



路过~~~~~
友情up~~~~~~~~

#13


god...

#14


不懂,帮顶,学习,蹭分.


最好给出完整的表结构,测试数据,计算方法和正确结果.


发帖注意事项
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281

#15


临时表啊.
if exists(select * from dbo.sysobjects where id = object_id(N'[SaveMoney]') and objectproperty(id,N'IsUserTable') = 1) 
drop table SaveMoney 

#16


引用 14 楼 dawugui 的回复:
SQL code不懂,帮顶,学习,蹭分.

SQL code最好给出完整的表结构,测试数据,计算方法和正确结果.

发帖注意事项
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281


我想给啊..给了你们更看不懂了.

#17


写得乱七八糟的

#18


引用 17 楼 nianran520 的回复:
写得乱七八糟的


兄弟,不要胡乱评价..我是不咋的..但代码不是我写的..是我一个走了的同事.这个算少的了.还有几千行的代码呢.

#19


那我只能说你同事非常非常不负责 

#20


谁都不可能考虑得那么全面的.这个存储过程在每当有业务交接的时候计算就有误.所以我想要交接后的数据不再drop table,而是insert.之前的数据手动改过来.

#21


mark

#22


好长好长好长

#23


长。。。

#24


给你一堆钱,一个麻袋,你从哪开始装?

#25


引用 24 楼 liuyanfeng23 的回复:
给你一堆钱,一个麻袋,你从哪开始装?

问题是钱装好了.又进钱时,你又得把麻袋剪掉把钱倒出来,又重新装.能不能装好的钱不用倒出来,新进的钱装新袋子里.

#26


更具功能需求重写吧,这种代码没有修改的价值。

粗略看了一下,循环里面开8个临时表,每循环一次全部drop,快极都有限,更要命的是,这些临时表每次去数据都只和一个变量@Enddate相关,而@Enddate每次循环-1。

虽然我不知道具体的需求,但实现这样一个功能,超过10条语句算是失败。

#27


再瞄一眼,低估了临时表的数据量,是12个

#28


引用 26 楼 limpire 的回复:
更具功能需求重写吧,这种代码没有修改的价值。

粗略看了一下,循环里面开8个临时表,每循环一次全部drop,快极都有限,更要命的是,这些临时表每次去数据都只和一个变量@Enddate相关,而@Enddate每次循环-1。

虽然我不知道具体的需求,但实现这样一个功能,超过10条语句算是失败。

终于有人认真看了..这是一个统计业务员一个月里欠款追回情况,根据欠款追回算他的提成.@EndDate为所选日期.@daycount 为时间段一般为30.

#29


引用 27 楼 limpire 的回复:
再瞄一眼,低估了临时表的数据量,是12个

因为它要体现每个月每天的欠款情况.欠款率是根据每天的情况算的.

#30


我怎么认真看,倒是你需要看一下——如果没有开发文档的话,有开发文档的话就不要看它了,直接重写。

局外人很难帮到你,没有生产环境,写出来的东西不一定正确。

一点看法:

将循环里面的临时表提出来——这是速度的瓶颈,根据@DayCount计算一个时间范围,比如@MaxEndDate,一次性取完数据,其实数据应该就出来了,不需要循环,不外乎group by或累积。

#31


引用 30 楼 limpire 的回复:
我怎么认真看,倒是你需要看一下——如果没有开发文档的话,有开发文档的话就不要看它了,直接重写。

局外人很难帮到你,没有生产环境,写出来的东西不一定正确。

一点看法:

将循环里面的临时表提出来——这是速度的瓶颈,根据@DayCount计算一个时间范围,比如@MaxEndDate,一次性取完数据,其实数据应该就出来了,不需要循环,不外乎group by或累积。

是啊..局外人很难帮到忙啊

#32


不清楚业务逻辑,是很难插手滴。。。
建议楼主先把业务逻辑搞清楚,再决定是重写还是修改

#33


引用 32 楼 zc_0101 的回复:
不清楚业务逻辑,是很难插手滴。。。
建议楼主先把业务逻辑搞清楚,再决定是重写还是修改


呵呵,这段代码一段一段都测试过,当然清楚.但是对SQL不够纯熟,无从下手.如果像Limpire说的推翻重写.
这个东西还真是个鸡肋

#34


想问下这里的高手,为何建了#table又把随即把它们删掉呢?这样不就是跟建了普通的table而不是临时表,再把它们删掉一样吗?

推荐阅读
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
author-avatar
赛亚兔备_393
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有