用case
当标志为‘进’时取正,‘销’时取负。大概就这个意思

解决方案 »

  1.   

    借方金额和贷方金额已经是计算好的数据,所以单价和数量(借方,贷方)都可以不考虑了
    如果此处存有疑问,可以先试用 update 语句先处理数据update table
    set 借方金额 = 借方数量 * 单价
        贷方金额 = 贷方数量 * 单价
    from table 最后结存金额
    使用sum函数不就可以解决了么?
    select sum(借方金额)- sum(贷方金额)
    from table
    where 1=1
    (此处加入限制语句)
    :不太理解楼主说的先进先出的说法,需要说明的是 日期最好不要做主键,如果需要主键,最好精确到妙,然后在where 语句中使用 datediff 等等日期比较函数来限制查询出来的结果集
      

  2.   

    唉,楼上的都没有明白我的意思...不要管什么表结构,什么主键之类的,真正的表结构不是我在四楼贴出来的那样,我只是为了形象的说明一下而已.这是在做先进先出时碰到的一个问题,前两行是不同时间购入的产成品,后一行是发货,
    数量  单价  金额
        进 11    2.3   25.3
        进 12    1.1   13.2
        销    2     12     24  结存   21            ?[实际结存金额应该为: (11-2)*2.3+12*1.1=33.9]问该如何用SQL语句实现结存金额的计算? 敬请高手答复,谢谢
      

  3.   

    1.  (11-2)*2.3+12*1.1=33.9 , 也可能是  11*2.3+(12-2)*1.1=33.9, 故得出此表中必然有一个ProductID(产品ID) 是可以标示本次进销存记录唯一的字段2.   如果区分是进还是销,必定有一个Flag 字段来标示。3.   实现结存金额的计算
    --假设表名为tb_Cost--获取最小结存金额
    --使用max 单价处理 ,也可以使用min 获得最大结存金额 ,若所有商品进货单价唯一,则不会产生结存金额的误差,若进货单价不唯一,则会产生问题--建立视图
    creat view  vw_Cost
    select ProductID, sum(金额)TotalCost
    from tb_Cost
    where Flag = '进'
    group by ProductID
    union                             --联合
    select a.ProductID, sum( a.数量 * select max(b.单价) from tb_Cost b 
                                         where b.ProductID = a.ProductID 
                                         and b.Flag = '进')* -1
    from tb_Cost a 
    where Flag = '销'
    group by ProductIDselect ProductID , sum(TotalCost)  --结存金额
    from vw_Cost
    group by ProductID 防止进货单价不唯一的表设计 ,加入进货单价栏位进销标志 数量   单价 进货单价  金额
        进  11    2.3     0.0    25.3
        进  12    1.1     0.0    13.2
        销     2     12     2.3     24获取结存金额(一般用于资产清算)
    select ProductId , sum( case Flag
                               when '进'  then  金额
                               when '销'  then  数量 * 进货单价 * -1)
    from tb_Cost
    group by ProductId