表说明:
   tbGoods 货品基础信息表
   tbDepotInOutAccount 出入库记录表,InQuantity表示入库,OutQuantity表示出库,CreateDate表示出入库日期我利用下列简单的分组合计语句,得出了货品的"本期入库,本期出库,期末结转(入-出)",周期为一个月.
可库存汇总帐一般还有个"上期结转"数据,请问如何修改SQL语句,得到出入库时间:tbDepotInOutAccount.CreateDate<2009-12-1之前的出入库差额数据.SELECT dbo.tbGoods.ID, dbo.tbGoods.Name, SUM(dbo.tbDepotInOutAccount.InQuantity) 
      AS InQty, SUM(dbo.tbDepotInOutAccount.OutQuantity) AS OutQty, 
      SUM(dbo.tbDepotInOutAccount.InQuantity)- SUM(dbo.tbDepotInOutAccount.OutQuantity) AS CurQty
FROM dbo.tbGoods RIGHT OUTER JOIN
      dbo.tbDepotInOutAccount ON 
      dbo.tbGoods.ID = dbo.tbDepotInOutAccount.GoodsID
WHERE (dbo.tbDepotInOutAccount.CreateDate BETWEEN '2009-12-1' AND '2009-12-31')
GROUP BY dbo.tbGoods.ID, dbo.tbGoods.Name
多谢!

解决方案 »

  1.   

    得到出入库时间:tbDepotInOutAccount.CreateDate <2009-12-1之前的出入库差额数据--11月与12月的差额?
      

  2.   

    出入库的差额,不是月份的差额
    就是说,默认上期结转为12-1之前的(入-出)数据,SUM(dbo.tbDepotInOutAccount.InQuantity)- SUM(dbo.tbDepotInOutAccount.OutQuantity
      

  3.   

    最好给出完整的表结构,测试数据,计算方法和正确结果.发帖注意事项
    http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
      

  4.   

    表的结构很清晰啊,两个表的其它字段也没必要列出来的.
    多谢各位了.
    继续等SQL高手...
      

  5.   

    SELECT dbo.tbGoods.ID, dbo.tbGoods.Name, SUM(dbo.tbDepotInOutAccount.InQuantity) 
          AS InQty, SUM(dbo.tbDepotInOutAccount.OutQuantity) AS OutQty, 
          SUM(dbo.tbDepotInOutAccount.InQuantity)- SUM(dbo.tbDepotInOutAccount.OutQuantity) AS CurQty ,
       (select SUM(dbo.tbDepotInOutAccount.InQuantity)- SUM(dbo.tbDepotInOutAccount.OutQuantity)from tbDepotInOutAccount where dbo.tbDepotInOutAccount.CreateDate < '2009-12-01') as colname
    FROM dbo.tbGoods RIGHT OUTER JOIN 
          dbo.tbDepotInOutAccount ON 
          dbo.tbGoods.ID = dbo.tbDepotInOutAccount.GoodsID 
    WHERE (dbo.tbDepotInOutAccount.CreateDate BETWEEN '2009-12-1' AND '2009-12-31') 
    GROUP BY dbo.tbGoods.ID, dbo.tbGoods.Name 
      

  6.   

    SELECT dbo.tbGoods.ID, dbo.tbGoods.Name, SUM(dbo.tbDepotInOutAccount.InQuantity) 
          AS InQty, SUM(dbo.tbDepotInOutAccount.OutQuantity) AS OutQty, 
          SUM(dbo.tbDepotInOutAccount.InQuantity)- SUM(dbo.tbDepotInOutAccount.OutQuantity) AS CurQty ,
       (select SUM(dbo.tbDepotInOutAccount.InQuantity)- SUM(dbo.tbDepotInOutAccount.OutQuantity)from tbDepotInOutAccount where a.goodsid = goodsid and CreateDate < '2009-12-01') as colname
    FROM dbo.tbGoods RIGHT b OUTER JOIN 
          dbo.tbDepotInOutAccount a ON 
          dbo.tbGoods.ID = dbo.tbDepotInOutAccount.GoodsID 
    WHERE (dbo.tbDepotInOutAccount.CreateDate BETWEEN '2009-12-1' AND '2009-12-31') 
    GROUP BY dbo.tbGoods.ID, dbo.tbGoods.Name 加个条件
      

  7.   

    谢谢楼上的思路,但没调试过去.
    SELECT 子句错误:'.' 附近的表达式。
    丢失 FROM 子句。
    GROUP BY 子句错误。
    无法对查询文本做语法分析。
      

  8.   

    select *
    from master..sysdatabases
    select *
    from csdn_test..sysobjects
    SELECT b.ID, b.Name, SUM(a.InQuantity) 
          AS InQty, SUM(a.OutQuantity) AS OutQty, 
          SUM(a.InQuantity)- SUM(a.OutQuantity) AS CurQty,
       (select SUM(InQuantity)- SUM(OutQuantity)
          from dbo.tbDepotInOutAccount 
    where a.goodsid = goodsid and CreateDate < '2009-12-01') as colname
    FROM dbo.tbGoods b RIGHT OUTER JOIN 
          dbo.tbDepotInOutAccount a ON 
          b.ID = a.GoodsID 
    WHERE (a.CreateDate BETWEEN '2009-12-1' AND '2009-12-31') 
    GROUP BY b.ID, b.Name 
      

  9.   

    我觉得最好把每次结转的数据保存下来 下次用的时候直接用
    case tbDepotInOutAccount.CreateDate when '2009-12-01' then ....
    不然的话你要得出上期结转 必须把所有日期的出入库数量进行加减
      

  10.   

    个人一个建议,LZ最好是使用记录来完成,不要使用SQL语句来获取上次的结存数据,数据少还可以,数据量大了以后执行效率太恼火了。
    比如每到一个周期的时候,就统计本月结存,生成一条结转数据后再写入数据表,要用的时候直接调取就可以了,这样的好处就是比较快,但是缺点就是前期基础数据一旦改变后就郁闷了。
      

  11.   

    SELECT b.ID, b.Name, SUM(a.InQuantity) AS InQty, SUM(a.OutQuantity) AS OutQty, 
          SUM(a.InQuantity) - SUM(a.OutQuantity) AS CurQty,
              (SELECT SUM(InQuantity) - SUM(OutQuantity)
             FROM dbo.tbGoods b RIGHT OUTER JOIN
                   dbo.tbDepotInOutAccount a ON b.ID = a.GoodsID
             WHERE a.CreateDate < '2009-12-25') AS colname
    FROM dbo.tbGoods b RIGHT OUTER JOIN
          dbo.tbDepotInOutAccount a ON b.ID = a.GoodsID
    WHERE (a.CreateDate BETWEEN '2009-12-1' AND '2009-12-31')
    GROUP BY b.ID, b.Name
    上述调试能过,但
    colname中的数据全是一个数,是不是没有分组?