求货物库存台账表计算结存数量和结存金额sql语句

duanyanhua0521 2014-12-17 04:13:24
我现在在做一张货物库存台账表,遇到了难题,请各位大侠帮帮忙指教一下:
我现在有如下表:
日期 单据类型 物料 仓库 收入数量 发出数量 rdsflag
2009-01-01 外购入库 A物料 A仓库 1 0 1
2009-02-01 其他入库 A物料 A仓库 3 0 1
2009-03-01 销售出库 A物料 A仓库 0 2 -1
2009-01-02 外购入库 B物料 B仓库 4 0 1
2009-02-02 其他入库 B物料 B仓 2 0 1
2009-03-02 销售出库 B物料 B仓 0 4 -1
如何写出每种货物当日的结存数量的SQL?
能得到如下的结果?
日期 单据类型 物料 仓库 收入数量 发出数量 结存数量
10
2009-01-01 外购入库 A物料 A仓库 1 0 11
2009-02-01 其他入库 A物料 A仓库 3 0 14
2009-03-01 销售出库 A物料 A仓库 0 2 12
2009-01-02 外购入库 B物料 B仓库 4 0 16
2009-02-02 其他入库 B物料 B仓库 2 0 18
2009-03-02 销售出库 B物料 B仓库 0 4 14


表结构:
create table tt
(
StockDate datetime, //业务日期
SrcType varchar(50), //单据类型
GoodName varchar(50), //货物名称
Branch varchar(50), //仓库
NUM Decimal(28,10), //出入库/数量
rdsflag int
)




存储过程
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
ALTER procedure cx_getAccount_RD @StockDate datetime, @enddate datetime
as
SET NOCOUNT ON
SET ANSI_WARNINGS OFF
--库存台帐表
declare @num decimal( 18, 2) --期初件数
declare @TotalPrice decimal( 18, 2) --期初金额

SELECT @num=SUM( rdsFlag * Num1)
FROM tt
WHERE StockDate <@StockDate

SELECT NULL AS 业务日期, '' as 单据类型, '' AS 仓库,
'' as 货物名称,
0 AS 入库件数,
0 AS 出库件数,
ISNULL(@num, 0) AS 结存件数,

UNION ALL

SELECT StockDate,SrcType,Branch,GoodsName,
SIGN(rdsflag + 1) * Num AS 入库件数,
SIGN(rdsflag - 1) * - 1 * Num1 AS 出库件数,
这里不知道怎么写 as 结存件数
FROM tt
WHERE StockDate >=@StockDate AND StockDate <=@enddate
go

求大神指教
...全文
551 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2014-12-18
  • 打赏
  • 举报
回复
期初件数不分物料,开头就不对啊!
duanyanhua0521 2014-12-18
  • 打赏
  • 举报
回复
解决了: 存储过程 SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO ALTER procedure cx_getAccount_RD @StockDate datetime, @enddate datetime as SET NOCOUNT ON SET ANSI_WARNINGS OFF --库存台帐表 declare @num decimal( 18, 2) --期初件数 declare @TotalPrice decimal( 18, 2) --期初金额 SELECT @num=SUM( rdsFlag * Num1) FROM tt WHERE StockDate <@StockDate SELECT NULL AS 业务日期, '' as 单据类型, '' AS 仓库, '' as 货物名称, 0 AS 入库件数, 0 AS 出库件数, ISNULL(@num, 0) AS 结存件数, UNION ALL SELECT StockDate,SrcType,Branch,GoodsName, SIGN(rdsflag + 1) * Num AS 入库件数, SIGN(rdsflag - 1) * - 1 * Num1 AS 出库件数, 0.00 as 结存件数 FROM tt WHERE StockDate >=@StockDate AND StockDate <=@enddate go 是在程序里结算的: for (int i = 1; i < source.Rows.Count; i++) { source.Rows[i]["结存数量"] = float.Parse(source.Rows[i - 1]["结存数量"].ToString()) + float.Parse(source.Rows[i]["入库数量"].ToString()) - float.Parse(source.Rows[i]["出库数量"].ToString()); source.Rows[i]["结存金额"] = float.Parse(source.Rows[i - 1]["结存金额"].ToString()) + float.Parse(source.Rows[i]["入库金额"].ToString()) - float.Parse(source.Rows[i]["出库金额"].ToString()); }
还在加载中灬 2014-12-17
  • 打赏
  • 举报
回复
CREATE procedure cx_getAccount_RD
	@StockDate datetime, @enddate datetime
AS
BEGIN
	SET NOCOUNT ON
	SET ANSI_WARNINGS OFF

	;WITH ttCTE AS(
		SELECT *
			,ROW_NUMBER()OVER(PARTITION BY GoodName,Branch ORDER BY StockDate)RN
		FROM tt
		WHERE StockDate>=@StockDate AND StockDate<=@enddate
	)
	,CTE AS(
		SELECT
			T1.StockDate--业务日期
			,T1.SrcType--单据类型
			,T1.GoodName--货物名称
			,T1.Branch--仓库
			,CASE WHEN T1.rdsFlag>0 THEN T1.NUM ELSE 0 END InNUM--收入数量
			,CASE WHEN T1.rdsFlag<0 THEN T1.NUM ELSE 0 END OutNUM--发出数量
			,ISNULL(T2.NUM1,0)+T1.NUM*T1.rdsFlag SUMNUM--结存数量
			,T1.RN
		FROM
			ttCTE T1
				LEFT JOIN(
					SELECT GoodName,Branch
						,SUM(rdsFlag*NUM)NUM1
					FROM tt
					WHERE StockDate<@StockDate
					GROUP BY GoodName,Branch
				)T2 ON T1.GoodName=T2.GoodName AND T1.Branch=T2.Branch
		WHERE T1.RN=1
		UNION ALL
		SELECT
			T1.StockDate
			,T1.SrcType
			,T1.GoodName
			,T1.Branch
			,CASE WHEN T1.rdsFlag>0 THEN T1.NUM ELSE 0 END InNUM
			,CASE WHEN T1.rdsFlag<0 THEN T1.NUM ELSE 0 END OutNUM
			,T2.SUMNUM+T1.NUM*T1.rdsFlag
			,T1.RN
		FROM ttCTE T1
			JOIN CTE T2 ON T1.GoodName=T2.GoodName AND T1.Branch=T2.Branch
				AND T1.RN=T2.RN+1
	)
	SELECT * FROM CTE
	ORDER BY GoodName,Branch,RN
	END
GO
----
EXEC cx_getAccount_RD '2009-01-01','2009-03-02'
Tiger_Zhao 2014-12-17
  • 打赏
  • 举报
回复
求期初件数时不分物料的吗?

要用临时表,按天循环插入。
简单点的方式就是直接以该天有发生的(单据类型,物料,仓库)为条件,把到当天为止的明细直接合计起来。
卷序列号码为 00000030 4489:1826 C:. │ sqlserver2000.txt │ ├─第01章 │ 1.9.1 设置内存选项.sql │ 1.9.2(2) 使用文件及文件组.sql │ 1.9.2(3) 调整tempdb数据库的文件属性.sql │ ├─第02章 │ │ 2.1 日期概念理解中的一些测试.sql │ │ 2.2.4 CONVERT在日期转换中的使用示例.sql │ │ 2.3.3 SET DATEFORMAT对日期处理的影响.sql │ │ 2.3.4 SET LANGUAGE对日期处理的影响示例.sql │ │ 2.4.1 日期格式化处理.sql │ │ 2.4.2 日期推算处理.sql │ │ 2.4.3 特殊日期加减函数.sql │ │ 2.5.1 查询指定日期段内过生日的人员.sql │ │ 2.5.2 生成日期列表的函数.sql │ │ 2.5.3 工作日处理函数(标准节假日).sql │ │ 2.5.3 工作日处理函数(自定义节假日).sql │ │ 2.5.4 计算工作时间的函数.sql │ │ │ └─其他 │ 交叉表.sql │ 任意两个时间之间的星期几的次数-横.sql │ 任意两个时间之间的星期几的次数-纵.sql │ 复杂年月处理.sql │ 统计--交叉表+日期+优先.sql │ ├─第03章 │ │ 3.2 各种字符串分拆处理函数.sql │ │ 3.3 各种字符串合并处理示例.sql │ │ 3.4.1 分段截取函数.sql │ │ 3.4.2 分段更新函数.sql │ │ 3.4.3 IP地址处理函数.sql │ │ 3.5.1 字符串比较函数.sql │ │ 3.5.2 字符串并集&交集处理示例.sql │ │ 3.5.3 字符串分拆并统计的处理示例.sql │ │ 3.5.5 字符串处理示例--列车车次查询.sql │ │ 3.6.2 字符串在编号查询中的应用示例及常见问题.sql │ │ 3.6.3 动态参数的存储过程示例.sql │ │ 3.6.4 动态他Transact-SQL语句处理中的常见问题演示.sql │ │ 3.7.3 text与ntext字段的复制和合并处理示例.sql │ │ 3.7.4 text与image字段转换处理示例.sql │ │ 3.7.5 ntext字段的REPLACE处理示例.sql │ │ │ └─其他 │ varbinary转换成字符串.sql │ 关键字搜索.sql │ 分解公式.sql │ 字符串分拆--格式化.sql │ 得到一个字符串在另一个字符串中出现的次数.sql │ 数字转换成十六进制.sql │ 比较第一与第二个字符串,是否有连续的5个字符相同.sql │ 生成查询的模糊匹配字符串.sql │ 简繁转换.sql │ 统计一个表中某个字符出现最多的字母.sql │ 非法字符串处理.sql │ ├─第04章 │ │ 4.1.5 在各种处理中应用排序规则的示例.sql │ │ 4.2.1 排序规则在拼音处理中的应用.sql │ │ 4.2.2 排序规则在全角与半角处理中的应用.sql │ │ │ └─其他 │ 生成GB2312汉字表.sql │ 生成GBK汉字表.sql │ 自动获取汉字笔画.sql │ ├─第05章 │ │ 5.1.1 SET IDENTITY_INSERT 中的几个问题.sql │ │ 5.1.1 修改标识值的示例.sql │ │ 5.1.1 标识列与普通列互相转换的示例.sql │ │ 5.2.1 查表法按日期生成流水号的示例.sql │ │ 5.2.1 查表法生成流水号的示例.sql │ │ 5.2.2 使用编号表按日期生成流水号的示例.sql │ │ 5.2.2 使用编号表生成流水号的示例.sql │ │ 5.2.3 生成纯字母随机编号的示例(仅大小或者小写).sql │ │ 5.2.3 生成纯字母随机编号的示例(大小写混合).sql │ │ 5.2.3 生成纯数字随机编号的示例.sql │ │ 5.3.2 融合了补号处理的编号生成处理示例.sql │ │ 5.3.3 使用UPDATE进行编号重排的处理示例.sql │ │ 5.3.3 使用临时表进行编号重排的处理示例.sql │ │ 5.3.3 使用子查询进行编号重排的处理示例.sql │ │ 5.3.3 名次查询的处理示例.sql │ │ 5.4.1 查询已用编号分布情况的示例(临时表法).sql │ │ 5.4.1 查询已用编号分布情况的示例(子查询法).sql │ │ 5.4.2 查询缺号分布情况的示例.sql │ │ 5.4.3 返回已用编号、缺号分布字符串的处理示例.sql │ │ 5.4.4 缺勤天数统计的处理示例.sql │ │ │ └─其他 │ -补位法.sql │ 以另一个表的字段做默认值.sql │ 以另一表的字段生成编号.sql │ 关联部门流水号.sql │ 十六进制.sql │ 学号.sql │ 开票统计--涉及到连号处理.sql │ 新编号查询示例(分类查询).sql │ 新编号查询示例.sql │ 日期流水号.sql │ 材料流水号.sql │ 流水号.sql │ 箱编号连号处理.sql │ 类别自动生成编号示例.sql │ 自已做标识列的例子.sql │ 触发器自动维护已用&未用编号.sql │ 连续编号.sql │ 防止重复的示例.sql │ 项目编号=各项目独立流水号&各年不同.sql │ ├─第06章 │ │ 6.1.1 NULL对IN的查询的影响及解决示例.sql │ │ 6.1.2 各种联接的使用示例.sql │ │ 6.1.2 多表联结导致记录重复的示例.sql │ │ 6.1.3 使用UNION实现库存报表的示例.sql │ │ 6.1.5 按指定上下限区间进行数据统计的示例.sql │ │ 6.1.6 随机出题的示例.sql │ │ 6.2.1 ROLLUP实现的分级汇总示例(定义各汇总列标题).sql │ │ 6.2.1 ROLLUP实现的分级汇总示例(带排序及汇总列标题处理).sql │ │ 6.2.1 ROLLUP实现的分级汇总示例(带排序处理).sql │ │ 6.2.1 ROLLUP实现的分级汇总示例.sql │ │ 6.2.1 UNION ALL实现的分级汇总示例.sql │ │ 6.3.1 简单的交叉报表处理示例.sql │ │ 6.3.2 多列转换为行的交叉报表处理示例.sql │ │ 6.3.3 行值动态变化的交叉报表处理示例(转换多列).sql │ │ 6.3.3 行值动态变化的交叉报表处理示例.sql │ │ 6.3.4 化解字符串不能超过8000的方法.sql │ │ 6.3.5 特殊的交叉报表处理示例.sql │ │ 6.4.1 库存明细帐处理示例(包含结存数).sql │ │ 6.4.1 库存明细帐处理示例.sql │ │ 6.4.2 同期及上期数据对比处理示例.sql │ │ 6.4.3 动态分组处理示例.sql │ │ 6.4.4 排行榜处理示例.sql │ │ │ └─其他 │ 交叉表--复杂名次.sql │ 交叉表-优先级处理.sql │ 交叉表分析.sql │ 分级汇总.sql │ 分组交叉表.sql │ 列转行.sql │ 固定行列报表.sql │ 复杂交叉表.sql │ 复杂交叉表1.sql │ 多栏显示.sql │ 日期+星期+时间.sql │ 格式化报表.sql │ 横转竖-1.sql │ 横转竖-字段名.sql │ 横转竖-生成字段名.sql │ 横转竖.sql │ 行列互换的复杂交叉表.sql │ 限制列数的交叉表.sql │ ├─第07章 │ │ 7.1 splitpage.asp │ │ 7.2.1 TOP n 实现的通用分页存储过程.sql │ │ 7.2.2 字符串缓存实现的通用分页存储过程.sql │ │ 7.2.3 临时表缓存实现的通用分页存储过程.sql │ │ 7.2.4 使用系统存储过程实现的通用分页存储过程.sql │ │ 7.3.1 实现随机分页的通用分页存储过程.sql │ │ 7.3.2 根据分类表实现的分页存储过程.sql │ │ │ └─其他 │ sp_cursor.sql │ 基本方法.sql │ ├─第08章 │ │ 8.1.2 树形数据分级汇总示例.sql │ │ 8.1.3 树形数据编号重排的通用存储过程.sql │ │ 8.1.3 树形数据编号重排示例.sql │ │ 8.1.4 实现编码规则调整处理的通用存储过程.sql │ │ 8.1.4 生成编码规则调整处理T-SQL语句的函数.sql │ │ 8.1.5 删除节点处理的通用存储过程.sql │ │ 8.1.5 移动节点处理的通用存储过程.sql │ │ 8.2.2 树形数据层次显示处理示例.sql │ │ 8.2.2 树形数据广度排序处理示例.sql │ │ 8.2.2 树形数据深度排序处理示例(模拟单编号法).sql │ │ 8.2.2 树形数据深度排序处理示例(递归法).sql │ │ 8.2.3 查找指定节点的所有子节点的示例函数.sql │ │ 8.2.4 查找指定节点的所有父节点的示例函数.sql │ │ 8.2.5 校验插入指定结点是否导致编码循环的示例函数.sql │ │ 8.2.5 校验表中数据是否有循环编码的通用存储过程.sql │ │ 8.2.6 复制指定节点及其所有子节点到指定结点的处理示例(借鉴方式排序法).sql │ │ 8.2.6 复制指定节点及其所有子节点到指定结点的处理示例.sql │ │ 8.2.7 实现删除指定结点及所有子节点的处理触发器.sql │ │ 8.2.8 逐级汇总示例(循环逐级累计法).sql │ │ 8.2.8 逐级汇总示例(用户定义函数法).sql │ │ 8.3.1 产品配件清单查询示例.sql │ │ 8.3.2 最短乘车路线查询示例.sql │ │ │ └─其他 │ xml菜单.sql │ 宝塔形数据的处理-1.sql │ 宝塔形数据的处理.sql │ 树形数据生成xml.sql │ ├─第09章 │ │ 9.1.3 访问外部数据源方法总结.sql │ │ 9.5.1 二进制文件存取示例(T-SQL).sql │ │ 9.5.1 二进制文件存取示例(VB&VBA).vbs │ │ a.txt │ │ Schema.ini │ │ │ └─其他 │ bcp-数据导入导出(全).sql │ bcp-数据导入导出-二进制文件.sql │ bcp-数据导出为文件.sql │ bcp表数据存为XML.sql │ SQL Server到Oracle连接服务器的实现.sql │ SQL Server到SQLBASE连接服务器的实现.sql │ SQL Server到SYBASE连接服务器的实现.sql │ sql导出mysql.sql │ textcopy实现文件存取.sql │ Vb程序实现文件存取.sql │ 导入文本文件时如何指定字段类型.sql │ 导出northwind中Employees的图像.sql │ 将某个目录上的Excel表,导入到数据库中.sql │ 数据导入导出基本方法.sql │ 用ASP上传&下载文件.sql

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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