求物料收发明细表计算每日结存数量的SQL

cclzxy2009 2009-08-14 01:03:16
各位大侠:小弟现在在做一张物料收发明细报表时,遇到了如下难题,恳请赐教. 问题描述如下,
现有如下数据的表:
日期 单据类型 物料 仓库 期初数量 收入数量 发出数量 结存数量
2009-01-01 外购入库 A物料 A仓库 10 1 0 0
2009-02-01 其他入库 A物料 A仓库 0 3 0 0
2009-03-01 销售出库 A物料 A仓库 0 0 2 0
2009-01-02 外购入库 B物料 B仓库 20 4 0 0
2009-02-02 其他入库 B物料 B仓库 0 2 0 0
2009-03-02 销售出库 B物料 B仓库 0 0 4 0
...
如何写出求出每种物料每日的期初数量和结存数量的SQL?

能得到如下的结果?
日期 单据类型 物料 仓库 期初数量 收入数量 发出数量 结存数量
2009-01-01 外购入库 A物料 A仓库 10 1 0 11
2009-02-01 其他入库 A物料 A仓库 11 3 0 14
2009-03-01 销售出库 A物料 A仓库 14 0 2 12
2009-01-02 外购入库 B物料 B仓库 20 4 0 24
2009-02-02 其他入库 B物料 B仓库 24 2 0 26
2009-03-02 销售出库 B物料 B仓库 26 0 4 22
...
表结构:
create table tt
(
FDate datetime,
FBilltype varchar(50),
FItem varchar(50),
FStock varchar(50),
FBegQty Decimal(28,10),
FInQty Decimal(28,10),
FOutQty Decimal(28,10),
FEndQty Decimal(28,10)
)
...全文
639 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cclzxy2009 2009-08-14
  • 打赏
  • 举报
回复
谢谢各位的热心帮助!按jiangshun的方法,问题已解决!
jiangshun 2009-08-14
  • 打赏
  • 举报
回复
if object_id('[TB]') is not null drop table [TB]
create table TB
(
FDate varchar(10),
FBilltype varchar(50),
FItem varchar(50),
FStock varchar(50),
FBegQty Decimal(28,10),
FInQty Decimal(28,10),
FOutQty Decimal(28,10),
FEndQty Decimal(28,10)
)
insert [TB]
select '2009-01-01','外购入库','A物料','A仓库',10,1,0,0 union all
select '2009-02-01','其他入库','A物料','A仓库',0,3,0,0 union all
select '2009-03-01','销售出库','A物料','A仓库',0,0,2,0 union all
select '2009-01-02','外购入库','B物料','B仓库',20,4,0,0 union all
select '2009-02-02','其他入库','B物料','B仓库',0,2,0,0 union all
select '2009-03-02','销售出库','B物料','B仓库',0,0,4,0

select 日期=FDate,
单据类型=FBilltype,
物料=FItem,
仓库=FStock,
期初数量=isnull((select sum(FBegQty+FInQty-FOutQty) from TB where t.FItem=FItem and t.FDate>FDate),FBegQty),
收入数量=FInQty,
发出数量=FOutQty,
结存数量=isnull((select sum(FBegQty+FInQty-FOutQty) from TB where t.FItem=FItem and t.FDate>FDate),FBegQty)+FInQty-FOutQty
from TB t

/*
日期 单据类型 物料 仓库 期初数量 收入数量 发出数量 结存数量
---------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
2009-01-01 外购入库 A物料 A仓库 10.0000000000 1.0000000000 0.0000000000 11.0000000000
2009-02-01 其他入库 A物料 A仓库 11.0000000000 3.0000000000 0.0000000000 14.0000000000
2009-03-01 销售出库 A物料 A仓库 14.0000000000 0.0000000000 2.0000000000 12.0000000000
2009-01-02 外购入库 B物料 B仓库 20.0000000000 4.0000000000 0.0000000000 24.0000000000
2009-02-02 其他入库 B物料 B仓库 24.0000000000 2.0000000000 0.0000000000 26.0000000000
2009-03-02 销售出库 B物料 B仓库 26.0000000000 0.0000000000 4.0000000000 22.0000000000

(6 行受影响)

*/

drop table TB
百年树人 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 josy 的回复:]
SQL codeupdate ttset FEndQty=FBegQty+FInQty-FEndQtyselect*from tt
[/Quote]
没有环境测试,试试
[code=SQL]update t
set
t.FBegQty=(select top 1 FBegQty+FInQty-FEndQty from tt where FDate<t.FDate),
t.FEndQty=t.FBegQty+t.FInQty-t.FEndQty
from
tt t
[/code]
cclzxy2009 2009-08-14
  • 打赏
  • 举报
回复
to jianshun:
这样可以算出结存数量,但是如何计算出每日的期初数量呢?这个表可能有很多种物料,表按物料进行了分组,如果是一个物料还好,问题是有多个物料的情况,就不知如何处理了。
百年树人 2009-08-14
  • 打赏
  • 举报
回复
update tt
set FEndQty=FBegQty+FInQty-FEndQty

select * from tt
jiangshun 2009-08-14
  • 打赏
  • 举报
回复
select 日期,单据类型,物料,仓库,期初数量,收入数量,发出数量,结存数量=期初数量+收入数量-发出数量
from 表

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧