SQL达人请进,这回我把问题说清楚些 20thinclient]

发布时间:2016-12-6 13:56:29 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"SQL达人请进,这回我把问题说清楚些 20thinclient]",主要涉及到SQL达人请进,这回我把问题说清楚些 20thinclient]方面的内容,对于SQL达人请进,这回我把问题说清楚些 20thinclient]感兴趣的同学可以参考一下。

求SQL语句,由“下量表”、“实收表”和“还款总表”求出“还款表”  注:这是自来水收费的一段功能,在许多QQ群问过,没有得到解答  下量表  bh xlrq    xlje  1 2008-1-1 4  1 2008-2-1 3  1 2008-3-1 4  1 2008-4-1 6  实收表  bh skrq     ssje  1  2008-1-2 2  1  2008-2-2 3  1  2008-2-3 3  1  2008-2-4 6  还款总表  bh xlrq    skrq       hkje  1 2008-1-1 2008-1-2   2  (1号用户在[2008-1-2]这天收的钱2元还给了1号用户在[2008-1-1]所下金额4元,没还清,还欠2元,下次收了再还) 1 2008-1-1 2008-2-2   2   (1号用户在[2008-2-2]这天收的钱3元还给了1号用户在[2008-1-1]由于所下金额还剩的2元,还清了,还余1元) 1 2008-2-1 2008-2-2   1   (1号用户在[2008-2-2]这天收的钱还剩的1元,还给1号用户在[2008-2-1]所下金额3元,没还清,还欠2元) 1 2008-2-1 2008-2-3   2  (1号用户在[2008-2-3]这天收的钱3元,还给上行还欠的2元,没还清,还剩1元) 还款表  bh xlrq       skrq     hkje  1 2008-3-1    2008-2-3 1  1 2008-3-1    2008-2-4 3  1 2008-4-1    2008-2-4 3  得出“还款表”是用于合并(通过insert)到“还款总表”,请不要由前两表直接生成新的“还款总表”,那样将来会有问题 我解释一下业务流程: 收水费基本过程,首先需要操作“下量表”,插入一笔如“1 2008-1-1 4 ”表示,[1]号用户在[2008-1-1] 这天被查明欠4元水费。然后收费员下去收费回来操作“实收表”,插入一笔如“1 2008-1-2 2”表示,[1]号 用户在[2008-1-2]这天被收2元水费。 那么为什么还需要第三个表“还款总表”呢?因为用户需要知道他哪天(用“实收表”的bh+skrq确定)还的是哪笔(用“下量表”的bh+xlrq确定), “还款总表”就回答了这个问题,该表正是同一bh用户的skrq和xlrq的对应。 这样一来,我们从“还款总表”中就可以看出每笔“下量”的“实收”情况,有是下量是一笔收清,有的是一笔收清还余(从后继行中能看出),有的是一笔未还清(从后继行中能看出)。 基本要求:在“还款总表”中,“实收表”中的实收金额(ssje)必须完全对应到“下量表”中的下量金额(xlje)(收了就要还到具体的帐上)。当然实收总金额超出了下量总金额时,完全对应后还有余款 。另外也会有完全没还的下量表行,这行下量就不要出现在“还款总表”里了。 当“下量表”或“实收表”中新增或删除了一行或多行时,造成基本要求不满足时(欠了且收了的没体现在“还款总表”中,上面头三个表的状态就是这样的),就需要一个存储过程来产生出“还款表”,然后把“还款表”插入“还款总表”。 最后,不能只有一个用户,请考虑到多个用户bh的情况,当然一个用户不能还到另一个用户上。下量日期(xlrq)较早的优先还掉,收款日期(skrq)较早的优先用来还。

发4个帖有意思?

引用 1 楼 liangCK 的回复:发4个帖有意思?

下面的代码只与下量表和收款表的最后一条记录以及收款总表有关,与下量表和收款表前面的记录无关。 不知道楼主是不是这个意思。 create table xlb(bh int, xlrq datetime,xlje int) insert xlb select 1, '2008-1-1', 4  union select 1,'2008-2-1', 3  union select 1,'2008-3-1', 4  union select 1,'2008-4-1', 6  create table ssb(bh int, skrq datetime,ssje  int) insert ssb select 1,'2008-1-2', 2  union select 1,'2008-2-2', 3 union select 1,'2008-2-3', 3  union select 1,'2008-2-4', 6  create table hkzb(bh int, xlrq datetime,skrq datetime,hkje  int) insert hkzb select 1,'2008-1-1'   ,'2008-1-2',   2  union select 1,'2008-1-1'  ,'2008-2-2',   2  union select 1,'2008-2-1'   ,'2008-2-2',   1  union select 1,'2008-2-1'   ,'2008-2-3',   2  go create proc get_hkb as begin  declare @xlb table(bh int, xlrq datetime,xlje int) declare @ssb table(bh int, skrq datetime,ssje  int) declare @hkb table(bh int, xlrq datetime,skrq datetime,hkje  int) declare @zh table(bh int,xlrq datetime,xlje int,hkje int,skrq datetime,ssje int,fpje int) --将数据转入新表,已经记录了还款的就不要了。 insert @xlb select * from xlb a where xlrq >isnull((select max(xlrq) from hkzb where bh= a.bh),'') insert @ssb select * from ssb a where skrq >isnull((select max(skrq) from hkzb where bh= a.bh),'') --但最后一次存在问题,需要补进新表,两种情况。 --获取还款总表中最后的下量日期和收款日期 insert @zh select bh,max(xlrq) xlrq,0,0,max(skrq) skrq,0,0 from hkzb group by bh --获取最后下量日期对应的下量金额 update @zh set xlje = b.xlje from @zh a,xlb b where a.bh = b.bh and a.xlrq = b.xlrq --获取最后收款日期对应的实收金额 update @zh set ssje = b.ssje from @zh a,ssb b where a.bh = b.bh and a.skrq = b.skrq --获取最后下量对应的还款总数 update @zh set hkje = isnull((select sum(hkje) from hkzb where a.bh= bh and a.xlrq = xlrq ),0) from @zh a --获取最后收款对应的分配总数 update @zh set fpje = isnull((select sum(hkje) from hkzb where a.bh= bh and a.skrq = skrq ),0) from @zh a --不可能存在即没有还清的下量,又有收款的剩余,如果存在,说明前面的数据有错误,直接返回。 if exists(select 1 from @zh where xlje <> hkje and ssje <> fpje) return -1 --补进数据 --如果xlje>hkje 说明最后一次下量还没有还清,剩下的放入下量表中。 insert @xlb select bh,xlrq,xlje-hkje from @zh where xlje>hkje --如果ssje>fpje 说明最后一次收款还没有分配完,剩下的放入收款表中。 insert @ssb select bh,skrq,ssje-fpje from @zh where ssje>fpje --现在与前面的还款总表无关了,直接计算 select bh,convert(char(10),xlrq,120) xlrq,convert(char(10),skrq,120) skrq,hkje from( select a.bh,xlrq,skrq,hkje=case when zxlje>zssje then zssje+xlje-zxlje  else zxlje+ssje-zssje end from  (select bh,xlrq,xlje,zxlje=(select sum(xlje) from @xlb where bh = a.bh and xlrq<=a.xlrq) from @xlb a)a, (select bh,skrq,ssje,zssje=(select sum(ssje) from @ssb where bh = a.bh and skrq<=a.skrq) from @ssb a)b where  a.bh = b.bh and ((zxlje>zssje and zxlje-zssje <xlje) or (zssje>=zxlje and zssje-zxlje <ssje)))c order by bh,xlrq,skrq return 0 end go get_hkb go drop table xlb,ssb,hkzb go drop proc get_hkb /* bh          xlrq       skrq       hkje         ----------- ---------- ---------- -----------  1           2008-03-01 2008-02-03 1 1           2008-03-01 2008-02-04 3 1           2008-04-01 2008-02-04 3 */

谢谢,不是我要的结果。 等我大大简化一下我的问题再问!

是有些错误,修正。 create table xlb(bh int, xlrq datetime,xlje int) insert xlb select 1, '2008-1-1', 4  union select 1,'2008-2-1', 3  union select 1,'2008-3-1', 4  union select 1,'2008-4-1', 2 create table ssb(bh int, skrq datetime,ssje  int) insert ssb select 1,'2008-1-2', 2  union select 1,'2008-2-2', 3 union select 1,'2008-2-3', 3  union select 1,'2008-2-4', 6  create table hkzb(bh int, xlrq datetime,skrq datetime,hkje  int) insert hkzb select 1,'2008-1-1'   ,'2008-1-2',   2  union select 1,'2008-1-1'  ,'2008-2-2',   2  union select 1,'2008-2-1'   ,'2008-2-2',   1  union select 1,'2008-2-1'   ,'2008-2-3',   2  go create proc get_hkb as begin  declare @xlb table(bh int, xlrq datetime,xlje int) declare @ssb table(bh int, skrq datetime,ssje  int) declare @hkb table(bh int, xlrq datetime,skrq datetime,hkje  int) declare @zh table(bh int,xlrq datetime,xlje int,hkje int,skrq datetime,ssje int,fpje int) --将数据转入新表,已经记录了还款的就不要了。 insert @xlb select * from xlb a where xlrq >isnull((select max(xlrq) from hkzb where bh= a.bh),'') insert @ssb select * from ssb a where skrq >isnull((select max(skrq) from hkzb where bh= a.bh),'') --但最后一次存在问题,需要补进新表,两种情况。 --获取还款总表中最后的下量日期和收款日期 insert @zh select bh,max(xlrq) xlrq,0,0,max(skrq) skrq,0,0 from hkzb group by bh --获取最后下量日期对应的下量金额 update @zh set xlje = b.xlje from @zh a,xlb b where a.bh = b.bh and a.xlrq = b.xlrq --获取最后收款日期对应的实收金额 update @zh set ssje = b.ssje from @zh a,ssb b where a.bh = b.bh and a.skrq = b.skrq --获取最后下量对应的还款总数 update @zh set hkje = isnull((select sum(hkje) from hkzb where a.bh= bh and a.xlrq = xlrq ),0) from @zh a --获取最后收款对应的分配总数 update @zh set fpje = isnull((select sum(hkje) from hkzb where a.bh= bh and a.skrq = skrq ),0) from @zh a --不可能存在即没有还清的下量,又有收款的剩余,如果存在,说明前面的数据有错误,直接返回。 if exists(select 1 from @zh where xlje <> hkje and ssje <> fpje) return -1 --补进数据 --如果xlje>hkje 说明最后一次下量还没有还清,剩下的放入下量表中。 insert @xlb select bh,xlrq,xlje-hkje from @zh where xlje>hkje --如果ssje>fpje 说明最后一次收款还没有分配完,剩下的放入收款表中。 insert @ssb select bh,skrq,ssje-fpje from @zh where ssje>fpje --现在与前面的还款总表无关了,直接计算 select t1.bh,convert(char(10),t1.xlrq,120) xlrq,convert(char(10),t2.skrq,120) skrq,     hkje= (case when t2.sum_ssje>t1.sum_xlje then t1.sum_xlje else t2.sum_ssje end) -           (case when t2.sum_ssje-t2.ssje>t1.sum_xlje-t1.xlje then t2.sum_ssje-t2.ssje else t1.sum_xlje-t1.xlje end) from (select *,sum_xlje=(select sum(xlje) from @xlb where bh=a.bh and xlrq<=a.xlrq) from @xlb a)t1  join (select *,sum_ssje=(select sum(ssje) from @ssb where bh=a.bh and ssje<=a.ssje) from @ssb a)t2 on t1.bh=t2.bh where t2.sum_ssje-t2.ssje<t1.sum_xlje and t2.sum_ssje>t1.sum_xlje-t1.xlje order by xlrq,skrq end go get_hkb go drop table xlb,ssb,hkzb go drop proc get_hkb /* bh          xlrq       skrq       hkje         ----------- ---------- ---------- -----------  1           2008-03-01 2008-02-03 1 1           2008-03-01 2008-02-04 3 1           2008-04-01 2008-02-04 2 */

上一篇:SQL Server 2005/8问题 100KnowShouldKnow]
下一篇:请问我想让SSIS包定期执行,比如一个月执行一次,我该如何设置呢?代理服务能完成上述功能码? 20wangnanjj666]

相关文章

相关评论