select (a.上年结转-sum(b.yuesl)+sum(c.yuesl)) as 上年yuesl,a.wlbm 
--加入其它需要的数据
from cc_rkckmx a,cc_rkckmx b,cc_rkckmx c
where a.wlyear=2002 and a.wlyear=b.wlyear and a.wlyear=c.wlyear
and a.wlbm=b.wlbm and a.wlbm=c.wlbm
--再加入你需要的其它连接条件
group by a.wlbm---修改修改

解决方案 »

  1.   

    我在pb下有一个程序,要求每年初运行一下此程序,就可以生成当前年的表中各个物料的结转记录。思路是:查找‘上一年’本物料id号最大的一条记录把此记录的yuesl, yuedj, yuje取过来即可,其中bz='上年结转',wlyear=当前年,wlmonth='01' ,wlday='01' 都是固定值,要求当表中有本年结转记录时就不要生成,即本程序一年可多次运行,其结果应该不变
      

  2.   

    我用此语句可以实现了,但我认为有些烦琐,想改进一下
    INSERT INTO cc_rkckmx(bz, wlyear, wlmonth, wlday, wlbm, yuesl, yuedj, yueje) SELECT '上年结转','2003','01','01', b.wlbm, b.yuesl, b.yuedj, b.yueje FROM cc_rkckmx as b WHERE (b.wlbm not in (SELECT wlbm FROM cc_rkckmx group by wlbm,wlyear having wlyear='2002' ) and b.id = (select max(id) from cc_rkckmx as c where c.wlyear='2002'  and b.wlbm=c.wlbm ))
      

  3.   

    我也写了一个,比你的还要更烦琐.......if  not exists  (select *  from  dbo.cc_rkckmx where ( wlyear = year(getdate())) AND ( bz= '上年结转'))INSERT INTO cc_rkckmx(bz, wlyear, wlmonth, wlday, wlbm, yuesl, yuedj, yueje) 
    SELECT '上年结转',  year(getdate()),'01','01', wlbm, yuesl, yuedj, yueje
    FROM dbo.cc_rkckmx
    WHERE (id IN
              (SELECT MAX(id) AS id
             FROM dbo.cc_rkckmx
             WHERE (wlyear =  year(getdate())-1) AND 
                   ( bz <> '上年结转')
             GROUP BY wlbm))
      

  4.   

    感谢ghxghx()!大家还有好方法吗?