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
如果此处存有疑问,可以先试用 update 语句先处理数据update table
set 借方金额 = 借方数量 * 单价
贷方金额 = 贷方数量 * 单价
from table 最后结存金额
使用sum函数不就可以解决了么?
select sum(借方金额)- sum(贷方金额)
from table
where 1=1
(此处加入限制语句)
:不太理解楼主说的先进先出的说法,需要说明的是 日期最好不要做主键,如果需要主键,最好精确到妙,然后在where 语句中使用 datediff 等等日期比较函数来限制查询出来的结果集
数量 单价 金额
进 11 2.3 25.3
进 12 1.1 13.2
销 2 12 24 结存 21 ?[实际结存金额应该为: (11-2)*2.3+12*1.1=33.9]问该如何用SQL语句实现结存金额的计算? 敬请高手答复,谢谢
--假设表名为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