库存账龄报表开发总结——Sqlserver LAG()的使用
库存账龄报表开发总结——Sqlserver LAG()的使用
开发需求
根据出入库流水明细,查询对应产品库存状态:包含库龄、库存量及其金额等。
注意:出库按照先入先出的规则进行。
例如:
物品 数量 日期 A 10 2020-01-01 A 20 2020-02-01 A 30 2020-03-03 A -5 2020-04-10 A -35 2020-05-15 A 300 2020-06-18 A -60 2020-11-10 A 90 2020-11-30 A -100 2020-12-12 B 20 2020-07-15 B 40 2020-10-11 B -30 2020-11-11 上面表示一个出入库流水明细
-- 建表,并插入数据 CREATE TABLE T_StkFlowDetail(id int primary key not null,goods_code varchar(20) null,num decimal(16,7) null,stk_date date not null )INSERT INTO [dbo].[T_StkFlowDetail]([id], [goods_code], [num], [stk_date]) VALUES (1, 'A', 10.0000000, '2020-01-01'); INSERT INTO [dbo].[T_StkFlowDetail]([id], [goods_code], [num], [stk_date]) VALUES (2, 'A', 20.0000000, '2020-02-01'); INSERT INTO [dbo].[T_StkFlowDetail]([id], [goods_code], [num], [stk_date]) VALUES (3, 'A', 30.0000000, '2020-03-03'); INSERT INTO [dbo].[T_StkFlowDetail]([id], [goods_code], [num], [stk_date]) VALUES (4, 'A', -5.0000000, '2020-04-10'); INSERT INTO [dbo].[T_StkFlowDetail]([id], [goods_code], [num], [stk_date]) VALUES (5, 'A', -35.0000000, '2020-05-15'); INSERT INTO [dbo].[T_StkFlowDetail]([id], [goods_code], [num], [stk_date]) VALUES (6, 'A', 300.0000000, '2020-06-18'); INSERT INTO [dbo].[T_StkFlowDetail]([id], [goods_code], [num], [stk_date]) VALUES (7, 'A', -60.0000000, '2020-11-10'); INSERT INTO [dbo].[T_StkFlowDetail]([id], [goods_code], [num], [stk_date]) VALUES (8, 'A', 90.0000000, '2020-11-30'); INSERT INTO [dbo].[T_StkFlowDetail]([id], [goods_code], [num], [stk_date]) VALUES (9, 'A', -100.0000000, '2020-12-12'); INSERT INTO [dbo].[T_StkFlowDetail]([id], [goods_code], [num], [stk_date]) VALUES (10, 'B', 20.0000000, '2020-07-15'); INSERT INTO [dbo].[T_StkFlowDetail]([id], [goods_code], [num], [stk_date]) VALUES (11, 'B', 40.0000000, '2020-10-11'); INSERT INTO [dbo].[T_StkFlowDetail]([id], [goods_code], [num], [stk_date]) VALUES (12, 'B', -30.0000000, '2020-11-11');
以
2020-12-31
为截止日期去判定最终展示报表形式物品 库存 0-60天 61-120天 121-180天 181-240天 241-300天 301-360天 A 250 90 0 0 160 0 0 B 30 0 30 0 0 0 0 需求分析
根据每次入库时间获取各时间段的库龄
根据出库按照先入先出的规则扣减库存
根据库龄将对应的库存、金额等相关数据展示
综上:该报表的难度在于如何先入先出的扣减库存
函数讲解
LAG 详细介绍:https://www.yiibai.com/sqlserver/sql-server-lag-function.html
SQL Server
LAG()
是一个Window函数,它提供对当前行之前的指定物理偏移量的行的访问。换句话说,通过使用
LAG()
函数,可以从当前行访问上一行的数据或上一行之前的行,依此类推。LAG()
函数对于将当前行的值与前一行的值进行比较非常有用-- 使用语法 LAG(return_value ,offset [,default]) OVER ([PARTITION BY partition_expression, ... ]ORDER BY sort_expression [ASC | DESC], ... )
DATEDIFF 详细介绍:https://www.yiibai.com/sqlserver/sql-server-datediff-function.html
计算年,月,周等两个日期之间的差值
-- 使用语法 DATEDIFF( date_part , start_date , end_date
解决方案
- 查询每个物品各时间段有库存情况下的库龄
SELECTgoods_code,stk_date,diff_days,current_stk_nums,current_stk_nums - ISNULL( LAG ( current_stk_nums ) OVER ( partition BY goods_code ORDER BY stk_date ), 0 ) current_stk_row_nums FROM(SELECTgoods_code,num,stk_date,DATEDIFF( DAY, stk_date, '2020-12-31' ) diff_days,SUM ( CASE WHEN num < 0 THEN num ELSE 0 END ) OVER ( PARTITION BY goods_code ) + SUM ( CASE WHEN num > 0 THEN num ELSE 0 END ) OVER ( PARTITION BY goods_code ORDER BY stk_date ) current_stk_nums FROMT_StkFlowDetail WHEREstk_date <= '2020-12-31' ) t WHEREcurrent_stk_nums > 0 AND num > 0
执行结果
此处建议将上述sql写成函数,方便报表输出
CREATE FUNCTION [dbo].[FUNC_GetStockAge] ( @end_date DATE ) RETURNS TABLE AS RETURN (SELECTgoods_code,stk_date,diff_days,current_stk_nums,current_stk_nums - ISNULL( LAG ( current_stk_nums ) OVER ( partition BY goods_code ORDER BY stk_date ), 0 ) current_stk_row_nums FROM(SELECTgoods_code,num,stk_date,DATEDIFF( DAY, stk_date, @end_date ) diff_days,SUM ( CASE WHEN num < 0 THEN num ELSE 0 END ) OVER ( PARTITION BY goods_code ) + SUM ( CASE WHEN num > 0 THEN num ELSE 0 END ) OVER ( PARTITION BY goods_code ORDER BY stk_date ) current_stk_nums FROMT_StkFlowDetail WHEREstk_date <= @end_date) t WHEREcurrent_stk_nums > 0 AND num > 0 )
报表输出语句
SELECT t.goods_code '物品', t.num '库存',SUM(IIF(t1.diff_days BETWEEN 0 AND 60,t1.current_stk_row_nums,0)) AS '0-60天',SUM(IIF(t1.diff_days BETWEEN 61 AND 120,t1.current_stk_row_nums,0)) AS '61-120天',SUM(IIF(t1.diff_days BETWEEN 121 AND 180,t1.current_stk_row_nums,0)) AS '121-180天',SUM(IIF(t1.diff_days BETWEEN 181 AND 240,t1.current_stk_row_nums,0)) AS '181-240天',SUM(IIF(t1.diff_days BETWEEN 241 AND 300,t1.current_stk_row_nums,0)) AS '241-300天',SUM(IIF(t1.diff_days BETWEEN 301 AND 360,t1.current_stk_row_nums,0)) AS '301-360天' FROM (-- 截止2020-12-31各物品的库存SELECT goods_code,SUM(num) num FROM T_StkFlowDetailWHERE stk_date < '2020-12-31'GROUP BY goods_codeHAVING SUM(num) > 0 )t LEFT JOIN FUNC_GetStockAge('2020-12-31') t1 ON t1.goods_code = t.goods_code WHERE t.num > 0 GROUP BY t.goods_code,t.num
输出结果
库存账龄报表开发总结——Sqlserver LAG()的使用相关推荐
- 库存账龄VS库存库龄
库存账龄VS库存库龄 前言:最近参与公司<集团存货管理>项目,其中库存涉及到账龄和库龄两个概念,业务部门时不时会混淆概念,特地撸一篇名词解析 库存账龄:指货物进入当前账套(库存组织)的时长 ...
- oracle erp 库存账龄,探讨Oracle Applications 库存及库龄的计算方法
CREATE TABLE BITC_ITEM_INV_ATUO_AGE ( ORGANIZATION_ID NUMBER, INVENTORY_ITEM_ID NUMBER, SUB_INV ...
- oracle erp 库存账龄,系统管理、年结后,新年度做账龄分析,原来几年的账龄-用友U8...
文章摘要:本文提供在用友U8V8.72erp软件财务会计管理的总账模块中系统管理.年结后,新年度做账龄分析,原来几年的账龄现在都在30-60天了,是什么原因?的解决办法. 问题现象:在用友U8V8.7 ...
- 到期日计算,账龄报表
到期日计算: 到期日是表示该应收应付是否已经到期,根据凭证产生时的基限日期(baseline date)和OME2定义的付款条件的日期计算而来. 应收应付账龄报表也是按此计算和出具. 系统标准的账龄分 ...
- vintage账龄报表代码
select date(payment_date), sum(case when period = 1 and overdue_long>8 then month_capital else nu ...
- 【MM系列】SAP库龄报表逻辑理解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP库龄报表逻辑理解 前言部分 大 ...
- 【MM系列】SAP SAP库龄报表逻辑理解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP SAP库龄报表逻辑理解 前言 ...
- SAP库存库龄逻辑分析
https://blog.csdn.net/kangliujie/article/details/74784596 库存账龄指库存物料在仓库的存放时间,可反映出物料周转率与物料需求计划的准确性, ...
- SAP库龄报表逻辑理解
SAP库龄报表逻辑理解 https://blog.csdn.net/SAPmatinal/article/details/65936087 第一篇 存货帐龄和呆滞料分析 通常库存周转率高,则帐龄 ...
最新文章
- 解析腾讯行政区划API接口数据
- 计算机中音乐设备数字接口,一种计算机用声卡封存装置的制作方法
- 全球Python调查报告:Python 2正在消亡,PyCharm比VS Code更受欢迎
- matlab仿真随机数的产生
- wxWidgets:将所有内容与 wxString 相互转换
- Linux基础命令(常用的)
- 推荐ReactNative脚手架工具
- SQL Server Profiler
- Zookeeper的集群架构以及读写原理
- html css周志,【嘉兴东臣php】HTML+CSS+JS周总结
- matlab gui期末设计,MATLABGUI课程设计期末大作业湖南理工学院
- 十大算法(动图讲解)❤️超详细!
- Java毕设项目车辆调度管理系统计算机(附源码+系统+数据库+LW)
- linux系统硬盘坏道,Linux下两种修复硬盘坏道方法
- 用户帐户控制---为了对电脑进行保护,已经阻止此应用。---管理员已阻止你运行此应。有关详细信息,请与管理员联系。
- 深度解析《软文广告经典案例300》
- 17.(cesium之家)cesium调整倾斜摄影位置(高度,平移,旋转,缩放)
- 灵州会盟及民族友好历史传统研讨会在吴忠召开
- 局计算机信息网络安全管理办法,区科技局网络安全与信息化管理制度
- 如何设置计算机桌面待办事项,电脑上怎么设置重要事情提醒?怎么在电脑桌面便签上设置重要事项提醒...