标题:查询凭证与余额表的游标
只看楼主
huangfrsj
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-9-4
结帖率:100%
 问题点数:0 回复次数:14 
查询凭证与余额表的游标
大虾帮忙解决游标问题
我在SQL Server2008中想通过凭证表与余额表连接查询得到如下结果:
年度    会计月份    科目编码    科目名称    期初余额    借方发生额    贷方发生额    期末余额
2011        1       1010102      备用金      10000      198981.97      177181.97     31800
2011        3       1010102      备用金      31800      44209          66009         10000
2011        4       1010102      备用金      10000      27471.35       27471.35      10000
2011        5       1010102      备用金      10000      27240.35       27240.35      10000
2011        6       1010102      备用金      10000      20480.35       30480.35        0
2011        7       1010102      备用金      0          45652          25652         20000
2011        8       1010102      备用金      20000      45334.5        45334.5       20000
2011        9       1010102      备用金      20000      26044          26044         20000
2011        10      1010102      备用金      20000      46029.5        46029.5       20000
2011        11      1010102      备用金      20000      58183          38183         40000
2011        12      1010102      备用金      40000      187916.76      187916.76     40000
以上结果省略了2012年的数据!

我写了下面的游标代码:
declare @n int,@nd char(12),@kjqj char(2),@kmbm char(7),@kmmc char(14),@qcye numeric(8,2),@jffs numeric(8,2),@dffs numeric(8,2),@qmye numeric(8,2)
set @n=1       '用以存储行数
declare xj cursor for
Select a.年度,会计月份,a.科目编码,a.科目名称
,b.期初余额
,cast(sum(借方金额) as numeric(8,2)),cast(sum(贷方金额) as numeric(8,2))
,b.期初余额+cast(sum(借方金额) as numeric(8,2))-cast(sum(贷方金额) as numeric(8,2))
 From [凭证库] a
join dbo.余额表 b on a.年度=b.年度 and a.科目编码=b.科目编码
 WHERE a.科目编码  LIKE'101%' AND (a.年度=2011 or a.年度=2012) group by a.年度,会计月份,a.科目编码,a.科目名称,期初余额
 order by a.年度,会计月份
open xj
print '年度    会计月份    科目编码      科目名称        期初余额      借方发生额     贷方发生额     期末余额'
fetch next from xj into @nd,@kjqj,@kmbm,@kmmc,@qcye,@jffs,@dffs,@qmye
while @@fetch_status=0
begin
    if @kjqj=1
        print @nd+@kjqj+'       '+@kmbm+'    '+@kmmc+'    '+cast(@qcye as char(10))+'    '+cast(@jffs as char(10))+'      '+cast(@dffs as char(10))+'    '+cast(@qmye as char(10))
    else
        begin
        
        print @nd+@kjqj+'       '+@kmbm+'    '+@kmmc+'    '+cast(@qmye as char(10))+'    '+cast(@jffs as char(10))+'      '+cast(@dffs as char(10))+'    '+cast(@qmye as char(10))
        
        end
fetch next from xj into @nd,@kjqj,@kmbm,@kmmc,@qcye,@jffs,@dffs,@qmye
end
close xj
deallocate xj

运行之后得到了与想要的结果不一致,如下:
年度    会计月份    科目编码      科目名称        期初余额      借方发生额     贷方发生额     期末余额
2011        1        1010102    备用金--报账员    10000.00      198981.97       177181.97     31800.00  
2011        3        1010102    备用金--报账员    -11800.00     44209.00        66009.00      -11800.00
2011        4        1010102    备用金--报账员    10000.00      27471.35        27471.35      10000.00  
2011        5        1010102    备用金--报账员    10000.00      27240.35        27240.35      10000.00  
2011        6        1010102    备用金--报账员    0.00          20480.35        30480.35      0.00      
2011        7        1010102    备用金--报账员    30000.00      45652.00        25652.00      30000.00  
2011        8        1010102    备用金--报账员    10000.00      45334.50        45334.50      10000.00  
2011        9        1010102    备用金--报账员    10000.00      26044.00        26044.00      10000.00  
2011        10       1010102    备用金--报账员    10000.00      46029.50        46029.50      10000.00  
2011        11       1010102    备用金--报账员    30000.00      58183.00        38183.00      30000.00  
2011        12       1010102    备用金--报账员    10000.00      187916.76       187916.76     10000.00  
2012        1        1010102    备用金--报账员    40000.00      76280.50        36280.50      80000.00  
2012        2        1010102    备用金--报账员    40000.00      29809.78        29809.78      40000.00  
2012        3        1010102    备用金--报账员    120000.00     159959.00       79959.00      120000.00
2012        4        1010102    备用金--报账员    70000.00      55745.00        25745.00      70000.00  
2012        5        1010102    备用金--报账员    -110000.00    49839.80        199839.80     -110000.00
2012        6        1010102    备用金--报账员    70000.00      56390.50        26390.50      70000.00  
2012        7        1010102    备用金--报账员    -10000.00     66239.08        116239.08     -10000.00
2012        8        1010102    备用金--报账员    40000.00      0.00            0.00          40000.00  
2012        9        1010102    备用金--报账员    20000.00      0.00            20000.00      20000.00  
2012        9        1010103    ****              20000.00      56710.50        36710.50      20000.00  
2012        10       1010103    ****              0.00          40410.00        40410.00      0.00      
2012        11       1010103    ****              0.00          14214.00        14214.00      0.00      
2012        12       1010103    ****             0.00          40265.70        40265.70      0.00      
我找了好久都没找出原因,请大家帮我修改一下,并将修改部分标注出来,谢了!

[ 本帖最后由 huangfrsj 于 2013-8-3 16:26 编辑 ]
搜索更多相关主题的帖子: 备用金 2011 会计 
2013-08-03 14:56
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
得分:0 
总是觉得用SQL语句是可以完成的事

★★★★★为人民服务★★★★★
2013-08-04 11:07
huangfrsj
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-9-4
得分:0 
回复 2楼 cnfarer
请不吝赐教!
2013-08-04 13:45
antjl
Rank: 2
等 级:论坛游民
威 望:1
帖 子:21
专家分:71
注 册:2012-8-16
得分:0 
你只是想把1月份和其他月份的期初余额用不同字段显示而已,只要用Case语句就可以了。使用方法参照http://bbs.
2013-08-05 11:37
huangfrsj
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-9-4
得分:0 
回复 4楼 antjl
四楼的大虾,我的意思是先把凭证表按月求和,然后和余额表连接,使得余额表中的余额作为新表中一月份的余额。接下来按“期初余额+借方发生额-贷方发生额=期末余额”操作,将得到的一月份的“期末余额”当作二月份的期初余额,循环本步骤,一直到十二月份。
2013-08-06 08:10
antjl
Rank: 2
等 级:论坛游民
威 望:1
帖 子:21
专家分:71
注 册:2012-8-16
得分:0 
Select 年度,会计月份,科目编码,科目名称,Sum(借方金额) As 借方金额,Sum(贷方金额) As  贷方金额 Into ##凭证库 From 凭证库 Group By 年度,会计月份,科目编码,科目名称 Order By 年度,会计月份,科目编码,科目名称

Go

Select a.年度,a.会计月份,a.科目编码,a.科目名称,c.期初余额+Sum(b.借方金额)-Sum(b.贷方金额)-a.借方金额+a.贷方金额 As 期初余额,a.借方金额,a.贷方金额,c.期初余额+Sum(b.借方金额)-Sum(b.贷方金额) As 期末余额
From ##凭证库 a,##凭证库 b,余额表 c
Where a.年度=c.年度 And a.科目编码=c.科目编码 And a.科目编码 Like '101%' And b.科目编码 Like '101%' And a.年度 In (2011,2012) And b.年度 In (2011,2012)
And Cast(Cast(a.会计月份 As VarChar(4)) + '-1'+'-'+Cast(a.年度 As VarChar(4)) As DateTime)>=Cast(Cast(b.会计月份 As VarChar(4)) + '-1'+'-'+Cast(b.年度 As VarChar(4)) As DateTime)
Group By a.年度,a.会计月份,a.科目编码,a.科目名称,c.期初余额,a.借方金额,a.贷方金额
Order By a.年度,a.会计月份,a.科目编码,a.科目名称,c.期初余额

Go

Drop Table ##凭证库

Go
2013-08-06 16:01
huangfrsj
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-9-4
得分:0 
回复 6楼 antjl
我把你的语句运行了一下,语句运行没有出错,但第二句运行后出现的结果没达到预期的效果,主要存在2011年末的期末余额与2012年的期初余额不一致
2011    12    1010102    备用金--报账员    40000    187916.76    187916.76    40000
2012    1    1010102    备用金--报账员    70000    76280.50    36280.50    110000

我本想是2011年末的期末余额是40000的话,那2012年初的期初余额也是40000,而运行的结果却是2012年的期初余额成了70000.

请大虾再帮我改一改第二段语句,提前谢你了!
2013-08-06 17:45
antjl
Rank: 2
等 级:论坛游民
威 望:1
帖 子:21
专家分:71
注 册:2012-8-16
得分:0 
Select 年度,会计月份,科目编码,科目名称,Sum(借方金额) As 借方金额,Sum(贷方金额) As  贷方金额 Into ##凭证库 From 凭证库 Group By 年度,会计月份,科目编码,科目名称 Order By 年度,会计月份,科目编码,科目名称

Go

Select a.年度,a.会计月份,a.科目编码,a.科目名称,c.期初余额+Sum(b.借方金额)-Sum(b.贷方金额)-a.借方金额+a.贷方金额 As 期初余额,a.借方金额,a.贷方金额,c.期初余额+Sum(b.借方金额)-Sum(b.贷方金额) As 期末余额
From ##凭证库 a,##凭证库 b,余额表 c
Where c.年度=2011 And a.科目编码=c.科目编码 And a.科目编码 Like '101%' And b.科目编码 Like '101%' And a.年度 In (2011,2012) And b.年度 In (2011,2012)
And Cast(Cast(a.会计月份 As VarChar(4)) + '-1'+'-'+Cast(a.年度 As VarChar(4)) As DateTime)>=Cast(Cast(b.会计月份 As VarChar(4)) + '-1'+'-'+Cast(b.年度 As VarChar(4)) As DateTime)
Group By a.年度,a.会计月份,a.科目编码,a.科目名称,c.期初余额,a.借方金额,a.贷方金额
Order By a.年度,a.会计月份,a.科目编码,a.科目名称,c.期初余额

Go

Drop Table ##凭证库

Go

[ 本帖最后由 antjl 于 2013-8-7 09:08 编辑 ]
2013-08-07 09:06
huangfrsj
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-9-4
得分:0 
回复 8楼 antjl
修改的语句与之前的一样,只是改成了查询一年的数据。能不能增加一个判断,如果:
a.年度=c.年度,则使用条件:
where a.科目编码=c.科目编码 And a.科目编码 Like '101%' And b.科目编码 Like '101%' And a.年度 In (2011,2012) And b.年度 In (2011,2012)
   And Cast(Cast(a.会计月份 As VarChar(2)) + '-1'+'-'+Cast(a.年度 As VarChar(4)) As DateTime)>=Cast(Cast(b.会计月份 As VarChar(2)) + '-1'+'-'+Cast(b.年度 As VarChar(4)) As DateTime)
如果:
a.年度>c.年度,则使用另一种条件呢?


2013-08-07 10:24
antjl
Rank: 2
等 级:论坛游民
威 望:1
帖 子:21
专家分:71
注 册:2012-8-16
得分:0 
晕,你有认真执行我给你的语句吗,怎么可能一样的,而且还是一年的数据!!!!!!?
2013-08-07 11:27



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-418544-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.154297 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved