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. zorka源码解读之Instrument实现原理

    主要用到三方面技术: beanshell来实现可扩展:告诉zorkaAgent插桩的具体需求,包括插桩的方法和值.插桩的时机.插桩追踪记录方式等. Instrument来通过代理的方式访问JVM,实现 ...

  2. js 封装设计cookie

    http://www.imooc.com/article/12700<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/ ...

  3. 解决 卸载Mysql后,服务还在的问题

    HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Eventlog\Application\MySQL文件夹:删除HKEY_LOCAL_MACHINE\ ...

  4. *HDU 1086 计算几何

    You can Solve a Geometry Problem too Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/3 ...

  5. iOS PCH文件

    在Xcode6之前,创建一个新的工程,Xcode会再Support Files文件夹下自动创建一个"工程名 - prefix.pch"文件,也是一个头文件,pch文件的内容能被项目 ...

  6. PHP关于反斜杠处理函数addslashes()和stripslashes()的用法

    addslashes() 例子: <?php $str = "Who's John Adams?"; echo $str . " This is not safe ...

  7. PAT (Basic Level) Practise 1040 有几个PAT(DP)

    1040. 有几个PAT(25) 时间限制 120 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 字符串APPAPT中包含了两个单 ...

  8. FJNU 1196 汪老司机(DP or 建图+最短路)

    1196: 汪老司机 Time Limit: 1000 MS         Memory Limit: 257792 KB 64-bit interger IO format: %lld       ...

  9. 【PC网站前端架构探讨系列】关于中小型PC网站前端架构方案的讨论与实践

    目   录 1.遇到的问题 2.目标 3.探讨 4.架构设想 5.流程 6.初步实现 7.存在问题 8.最后 遇到的问题 我在这个系列上篇文章 已经讲解并开始逐步应用模块化思想,不知大家还记不记得,题 ...

  10. 使用MyBatis对表执行CRUD操作

    一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: <?xml version="1.0&quo ...