标题:查询凭证与余额表的游标
取消只看楼主
huangfrsj
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-9-4
结帖率:100%
 问题点数:0 回复次数:7 
查询凭证与余额表的游标
大虾帮忙解决游标问题
我在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
huangfrsj
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-9-4
得分:0 
回复 2楼 cnfarer
请不吝赐教!
2013-08-04 13:45
huangfrsj
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-9-4
得分:0 
回复 4楼 antjl
四楼的大虾,我的意思是先把凭证表按月求和,然后和余额表连接,使得余额表中的余额作为新表中一月份的余额。接下来按“期初余额+借方发生额-贷方发生额=期末余额”操作,将得到的一月份的“期末余额”当作二月份的期初余额,循环本步骤,一直到十二月份。
2013-08-06 08:10
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
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
huangfrsj
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-9-4
得分:0 
回复 10楼 antjl
对不起了,大虾...
刚才认真地运行了一下,发现结果确实不一样,但仍出现了状况。运行修改前的语句的结果是:
年度    会计月份    科目编码      科目名称      期初余额    借方金额     贷方金额    期末余额
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       1        1010102    备用金--报账员    70000      76280.5      36280.5      110000
2012       2        1010102    备用金--报账员    110000     29809.78     29809.78     110000
2012       3        1010102    备用金--报账员    110000     159959       79959        190000
2012       4        1010102    备用金--报账员    190000     55745        25745        220000
2012       5        1010102    备用金--报账员    220000     49839.8      199839.8     70000
2012       6        1010102    备用金--报账员    70000      56390.5      26390.5      100000
2012       7        1010102    备用金--报账员    100000     66239.08     116239.08    50000
2012       8        1010102    备用金--报账员    50000          0            0        50000
2012       9        1010102    备用金--报账员    70000          0         20000       50000
2012      9      1010103   宋云           -10000     56710.5    36710.5     10000
2012     10      1010103   宋云            10000     40410      40410       10000
2012     11      1010103   宋云            10000     14214      14214       10000
2012     12      1010103   宋云            10000     40265.7    40265.7     10000

运行修改后的语句的结果是:
年度    会计月份    科目编码      科目名称     期初余额    借方金额    贷方金额    期末余额
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       1        1010102    备用金--报账员    40000    76280.5      36280.5      80000
2012       2        1010102    备用金--报账员    80000    29809.78     29809.78     80000
2012       3        1010102    备用金--报账员    80000    159959       79959        160000
2012       4        1010102    备用金--报账员    160000    55745       25745        190000
2012       5        1010102    备用金--报账员    190000    49839.8     199839.8     40000
2012       6        1010102    备用金--报账员    40000    56390.5      26390.5      70000
2012       7        1010102    备用金--报账员    70000    66239.08     116239.08    20000
2012     8       1010102   备用金--报账员   20000     0           0       20000
2012     9       1010102   备用金--报账员   40000     0        20000      20000

首先:两个结果比较的话,第二个结果少了“宋云”这个的科目的四条记录
其次:第二个结果中八月份期末余额不是九月份的期初余额。




[ 本帖最后由 huangfrsj 于 2013-8-7 12:52 编辑 ]
2013-08-07 12:48
huangfrsj
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-9-4
得分:0 
回复 12楼 antjl
谢了,大虾,帮了我大忙了!
2013-08-07 15:05
huangfrsj
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2012-9-4
得分:0 
回复 14楼 antjl
谢谢,我在运行时已经改了!
2013-08-08 16:56



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




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

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