现有两张表,一张入库表,一张出库表,想从这两张总结数据:
入库表数据:
      物资名称   物资编码  入库数量
       笔记本      B0001     10
       笔记本      B0001     20
       铅笔        B0002     5出库表数据:
      物资名称   物资编码  出库数量
       笔记本      B0001     9
       笔记本      B0001     10
       铅笔        B0002     2现想要总结出数据如下:
      物资名称   物资编码  入库数量  出库数量   库存数量
       笔记本      B0001     30         19        11
       铅笔        B0002     5          2         3请高手帮忙!

解决方案 »

  1.   

    类似于(不保证可执行,理解概念就行了):select a.物资名称,a.物资编码,sum(入库数量),sum(出库数量),sum(入库数量)-sum(出库数量)
      from (select 物资名称,物资编码 from 入库表 union select 物资名称,物资编码 from 出库数据) as a
    left join 入库表 as b on a.物资名称=b.物资名称 and a.物资编码=b.物资编码
    left join 出库表 as c on a.物资名称=c.物资名称 and a.物资编码=c.物资编码
    group by a.物资名称,a.物资编码
    不过,这种程序的(背景下的)设计逻辑不能用于真正的财务软件产品,只能作为一个课堂练习。真正的产品由于有着数千万记录,而库存、总账数据经常大量地需要及时查询计算,所以不可能是临时去汇总总入库数量和总出库数量的。真正的财务计算,需要及时将流水帐过账到日记账、总账中,也就是说每一天、每一个月的总入库数量、总出库数量、库存数量和成本是立刻做为静态查询出来的,而不是靠汇总计算出来的。
      

  2.   

    哦,肯定还需要考虑到null的情况,例如:
    select a.物资名称,a.物资编码,isnull(sum(入库数量),0),isnull(sum(出库数量),0),
      isnull(sum(入库数量),0)-isnull(sum(出库数量),0)
      from (select 物资名称,物资编码 from 入库表 union select 物资名称,物资编码 from 出库数据) as a
    left join 入库表 as b on a.物资名称=b.物资名称 and a.物资编码=b.物资编码
    left join 出库表 as c on a.物资名称=c.物资名称 and a.物资编码=c.物资编码
    group by a.物资名称,a.物资编码
      

  3.   

    我认为一个sql语句解决不了这个问题吧。为什么不多建立一张表出来留作库存更新呢?这样的话在程序中也能有很好的控制
      

  4.   

    select a.物资名称,a.物资编码,a.入库数量,isnull(b.出库数量,0) 出库数量,
           (a.入库数量-isnull(b.出库数量,0)) 库存数量
    from
    (select 物资名称,物资编码,sum(入库数量) 入库数量 from 入库表 group by 物资名称,物资编码) a
    left join 
    (select 物资名称,物资编码,sum(出库数量) 出库数量 from 出库表 group by 物资名称,物资编码) b
    on a.物资编码=b.物资编码