库存账龄报表开发总结——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()的使用相关推荐

  1. 库存账龄VS库存库龄

    库存账龄VS库存库龄 前言:最近参与公司<集团存货管理>项目,其中库存涉及到账龄和库龄两个概念,业务部门时不时会混淆概念,特地撸一篇名词解析 库存账龄:指货物进入当前账套(库存组织)的时长 ...

  2. oracle erp 库存账龄,探讨Oracle Applications 库存及库龄的计算方法

    CREATE TABLE BITC_ITEM_INV_ATUO_AGE ( ORGANIZATION_ID    NUMBER, INVENTORY_ITEM_ID  NUMBER, SUB_INV  ...

  3. oracle erp 库存账龄,系统管理、年结后,新年度做账龄分析,原来几年的账龄-用友U8...

    文章摘要:本文提供在用友U8V8.72erp软件财务会计管理的总账模块中系统管理.年结后,新年度做账龄分析,原来几年的账龄现在都在30-60天了,是什么原因?的解决办法. 问题现象:在用友U8V8.7 ...

  4. 到期日计算,账龄报表

    到期日计算: 到期日是表示该应收应付是否已经到期,根据凭证产生时的基限日期(baseline date)和OME2定义的付款条件的日期计算而来. 应收应付账龄报表也是按此计算和出具. 系统标准的账龄分 ...

  5. vintage账龄报表代码

    select date(payment_date), sum(case when period = 1 and overdue_long>8 then month_capital else nu ...

  6. 【MM系列】SAP库龄报表逻辑理解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP库龄报表逻辑理解 前言部分 大 ...

  7. 【MM系列】SAP SAP库龄报表逻辑理解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP SAP库龄报表逻辑理解 前言 ...

  8. SAP库存库龄逻辑分析

     https://blog.csdn.net/kangliujie/article/details/74784596 库存账龄指库存物料在仓库的存放时间,可反映出物料周转率与物料需求计划的准确性, ...

  9. SAP库龄报表逻辑理解

     SAP库龄报表逻辑理解 https://blog.csdn.net/SAPmatinal/article/details/65936087 第一篇 存货帐龄和呆滞料分析 通常库存周转率高,则帐龄 ...

最新文章

  1. 解析腾讯行政区划API接口数据
  2. 计算机中音乐设备数字接口,一种计算机用声卡封存装置的制作方法
  3. 全球Python调查报告:Python 2正在消亡,PyCharm比VS Code更受欢迎
  4. matlab仿真随机数的产生
  5. wxWidgets:将所有内容与 wxString 相互转换
  6. Linux基础命令(常用的)
  7. 推荐ReactNative脚手架工具
  8. SQL Server Profiler
  9. Zookeeper的集群架构以及读写原理
  10. html css周志,【嘉兴东臣php】HTML+CSS+JS周总结
  11. matlab gui期末设计,MATLABGUI课程设计期末大作业湖南理工学院
  12. 十大算法(动图讲解)❤️超详细!
  13. Java毕设项目车辆调度管理系统计算机(附源码+系统+数据库+LW)
  14. linux系统硬盘坏道,Linux下两种修复硬盘坏道方法
  15. 用户帐户控制---为了对电脑进行保护,已经阻止此应用。---管理员已阻止你运行此应。有关详细信息,请与管理员联系。
  16. 深度解析《软文广告经典案例300》
  17. 17.(cesium之家)cesium调整倾斜摄影位置(高度,平移,旋转,缩放)
  18. 灵州会盟及民族友好历史传统研讨会在吴忠召开
  19. 局计算机信息网络安全管理办法,区科技局网络安全与信息化管理制度
  20. 如何设置计算机桌面待办事项,电脑上怎么设置重要事情提醒?怎么在电脑桌面便签上设置重要事项提醒...

热门文章

  1. word把选择答案弄到题目里_怎么快速把WORD里题与答案分开 - 卡饭网
  2. 【网上国网】最新版算法
  3. 你怎能证明圣经上的话语是上帝的话语呢?
  4. 链表的二路归并排序 Sort List
  5. 将多个月的nc数据文件合并成一个(月平均)
  6. 如何运行一个python下的的小游戏
  7. 重装win7旗舰版系统无线网络红叉问题解决办法
  8. 解决思科 Cisco Packet Tracer 7.2登录问题
  9. 注意力机制详解系列(四):混合注意力机制
  10. 数据逻辑删除和物理删除的理解