1、首先是创建表:

create table #in
(
id int identity(1,1),
TDate datetime not null,
goodcode varchar(10) ,
InNum decimal(20,4) null, --入库数量
Price money null --入库金额
) create table #out
(
id int identity(1,1),
TDate datetime not null,
goodcode varchar(10) ,
OutNum decimal(20,4) null, --出库数量
salePrice money null, --销售价
costprice money null, --求成本价
costmoney money null --求成本金额
)

2、插入表数据:

 --入库
insert into #in(tdate,goodcode,InNum,Price) values('2016-1-1','',10,5)
insert into #in(tdate,goodcode,InNum,Price) values('2016-1-25','',60,6)
insert into #in(tdate,goodcode,InNum,Price) values('2016-3-1','',20,5.5)
insert into #in(tdate,goodcode,InNum,Price) values('2016-1-18','',30,6)
insert into #in(tdate,goodcode,InNum,Price) values('2016-4-1','',40,8) --出库
insert into #out(tdate,goodcode,outnum,salePrice,costprice) values('2016-1-2','',30,6,0)
insert into #out(tdate,goodcode,outnum,salePrice,costprice) values('2016-4-1','',40,8,0) select * from #in order by tdate
select * from #out order by tdate

3、

--按 先进先出法 算成本价
/*
1 2016-01-02 00:00:00.000 001 30.0000 6.0000 .0000 = (10*5 + 20 *6 )/30
成本金额 = 10*5 + 20 *6
2 2016-04-01 00:00:00.000 001 40.0000 8.0000 .0000 = (10*6 + 30 *6 )/40
成本金额 = 10*6 + 30 *6
*/

SELECT
o.id,o.tdate,o.goodcode,o.outnum,o.salePrice
,costprice=CAST(SUM((CASE WHEN i.SumInNum>o.Sumoutnum THEN o.Sumoutnum ELSE i.SumInNum END -CASE WHEN o.Sumoutnum-o.OutNum>i.SumInNum-i.InNum
THEN o.Sumoutnum-o.OutNum ELSE i.SumInNum-i.InNum END)*i.Price)/o.outnum AS MONEY)
,costmoney=CAST(SUM((CASE WHEN i.SumInNum>o.Sumoutnum THEN o.Sumoutnum ELSE i.SumInNum END -CASE WHEN o.Sumoutnum-o.OutNum>i.SumInNum-i.InNum
THEN o.Sumoutnum-o.OutNum ELSE i.SumInNum-i.InNum END)*i.Price) AS MONEY)
FROM
(SELECT *,SumInNum=(SELECT SUM(InNum) FROM #in WHERE goodcode=i.goodcode AND id<=i.id) FROM #in AS i) AS i,
(SELECT *,Sumoutnum=(SELECT SUM(outnum) FROM #out WHERE goodcode=i.goodcode AND id<=i.id) FROM #out AS i) AS o
WHERE i.goodcode=o.goodcode AND i.SumInNum-i.InNum<o.Sumoutnum AND o.Sumoutnum-o.OutNum<i.SumInNum
GROUP BY o.id,o.tdate,o.goodcode,o.outnum,o.salePrice
 /*
id tdate goodcode outnum salePrice costprice costmoney
1 2016-01-02 00:00:00.000 001 30.0000 6.00 5.6667 170.00
2 2016-04-01 00:00:00.000 001 40.0000 8.00 6.00 240.00
*/

SQLServer中用先进先出思想求成本价和平均成本单价的更多相关文章

  1. SQLserver中用convert函数转换日期格式

    SQLserver中用convert函数转换日期格式 2008-01-23 15:47 SQLserver中用convert函数转换日期格式2008-01-15 15:51SQLserver中用con ...

  2. SQLserver中用convert函数转换日期格式(1)

    SQLserver中用convert函数转换日期格式2008-01-15 15:51SQLserver中用convert函数转换日期格式 SQL Server中文版的默认的日期字段datetime格式 ...

  3. SqlServer中用@@IDENTITY取最新ID不准的问题

    最近遇到了一个SqlServer中用@@IDENTITY取最新ID不准的问题,经过在网上的一番查找,找到了如下资料,略作记录:"一个网友问我一个关于@@IDENTITY的问题.他的数据库中有 ...

  4. Vijos1055 奶牛浴场(极大化思想求最大子矩形)

    思路详见 王知昆<浅谈用极大化思想解决最大子矩形问题> 写得很详细(感谢~....) 因为不太会用递推,所以用了第一种方法,时间复杂度是O(n^2),n为枚举的点数,对付这题绰绰有余 思路 ...

  5. 算法导论学习之线性时间求第k小元素+堆思想求前k大元素

    对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...

  6. 关于SQLSERVER中用SQL语句查询的一些个人理解

    作为一个编程菜鸟说真的很难有什么见解,也就是写给一些刚学习编程的人,希望能给他们一些帮助吧! SQLSERVER作为刚开始入门学习的数据库,SQL语句也并不算太难!说白了也就是建库,建表,建约束,对数 ...

  7. SQL用先进先出存储过程求出库数量

    create table t( id ,), name ),--商品名称 j int, --入库数量 c int, --出库数量 jdate datetime --入库时间 ) ,,'2007-12- ...

  8. SqlServer中用SQL语句附加数据库及修改数据库逻辑文件名

    --查询数据库逻辑文件名 USE 数据库名 SELECT FILE_NAME(1) --查询数据库逻辑文件名(日志) USE 数据库名 SELECT FILE_NAME(2) --附加数据库 sp_a ...

  9. SQLserver中用convert函数转换日期格式(2)

    ), ): :57AM ), ): ), ): ), ): ), ): ), ): ), ): ), ): , ), ): :: ), ): :::827AM ), ): ), ): ), ): ), ...

随机推荐

  1. pandas 学习(1): pandas 数据结构之Series

    1. Series Series 是一个类数组的数据结构,同时带有标签(lable)或者说索引(index). 1.1 下边生成一个最简单的Series对象,因为没有给Series指定索引,所以此时会 ...

  2. 巴特沃斯(Butterworth)滤波器 (1)

    下面深入浅出讲一下Butterworth原理及其代码编写. 1. 首先考虑一个归一化的低通滤波器(截止频率是1),其幅度公式如下: 当n->∞时,得到一个理想的低通滤波反馈: ω<1时,增 ...

  3. Leetcode Trapping Rain Water

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  4. About_类与对象

    所谓类,就是把具有相同行为,特征的归为一类: 1)什么是面向对象: 起初,“面向对象”是专指在程序设计中采用封装.继承.抽象等设计方法.可是,这个定义显然不能再适合现在情况.面向对象的思想已经涉及到软 ...

  5. 从网易与淘宝的font-size思考前端设计稿与工作流

    本文结合自己对网易与淘宝移动端首页html元素上的font-size这个属性的思考与学习,讨论html5设计稿尺寸以及前端与设计之间协作流程的问题,内容较多,但对你的技术和工作一定有价值,欢迎阅读和点 ...

  6. 打包ipa出现问题记录

    1.打包ipa事,Archive出现问题 解决方法:Xcode->系统偏好设置->Accounts->选中正在使用的账户->view details->download ...

  7. C++STL -- vector实现

    STL的vector简化实现 本质 vector说到底就是一个动态数组,我们需要做的就是管理动态数组的内存,和元素的增加,删除,移动等. template <typename T> cla ...

  8. js日历选择控件

    mydate97: http://www.my97.net/dp/demo/index.htm

  9. 关于type erasure

    哇,好久没有写blog了,再不写的话,blog的秘密都要忘记了,嘿嘿. 最近在试着参与一个开源项目,名字叫avim(A Vibrate IM),别想多了哟.地址是:https://github.com ...

  10. 关于datagridview里使用combox的总结

    最近写的程序中需要在DataGridView中使用下拉选择的功能,首选方案是列的ColumnType属性 使用EditingControlShowing事件, if (e.Control is Com ...