155_模型_Power BI & Power Pivot 进销存之安全库存

一、背景

谈进销存的概念时,我们也需要提及另外一个概念:安全库存

库存周转在理想的状态下是做到零库存,但是在内部的资金占用及到货周期不确定和外部客户的现货率满足等诸多情况平衡下,想做到零库存几乎不可能。在这种平衡状态就有了安全库存;以上为笔者在平常的生产生活中感知。

在这里我们首先引入安全库存的数学公式:

说明

分布按照理想状态的标准正太分布,安全库存仅作为参考点,实际生产中需要加入业务的理解,进行调整。

数学公式转变为 DAX 公式:SS = z * SQRT ( σd ^ 2 * μL + σL ^ 2 * μd ^ 2 )

SS:安全库存(Safe Stock)。

z : 服务水平系数,服务水平(现货率)为 0.95,在标准正太分布下查表可得,对应的 z = 1.65。

L : 采购提前期,本案例中对应入库间隔天数。

μL: 平均提前期。

σL: 提前期 L 的标准差。

d : 日出库数量。

μd: 平均日出库数量。

σd: 日出库量 d 的标准差。

标准差公式使用:STDEVX.S

更多安全库存的信息参考:

https://baike.baidu.com/item/安全库存

Power BI 实际效果链接:

https://demo.jiaopengzi.com/pbi/155-full.html

二、DAX模型

1、数据表及关系

维度表:01_Calendar; T01_门店表; T00_产品表

事实表:T04_订单主表; T05_订单子表

度量值:00_Measure

辅助表:04_RefreshTime

计算表:02_Row

具体字段和关系如下图:

详细数据字段介绍见:

https://jiaopengzi.com/1435.html

2、度量值

度量值一览图

接下来我们把几个关键的度量值放上来。

0001_产品数量_入库

0001_产品数量_入库 =
SUM ( 'T03_入库信息表'[F_02_入库产品数量] )

0002_产品数量_出库

注意出库是需要按照订单主表里面的送货日期来计算,所以需要使用 USERELATIONSHIP 激活关系。

0002_产品数量_出库 =
CALCULATE (
SUM ( 'T05_订单子表'[F_05_产品销售数量] ),
USERELATIONSHIP ( 'T04_订单主表'[F_04_送货日期], '01_Calendar'[C01_Dates] )
)

0003_产品数量_库存_期末

关于库存的计算,给大家提供一个思路。库存就是当前时间点的历史累计入库与历史累计出库的差异。我们用一张图来表示。

在这样的思路下,我们也就很好使用 DAX 写进销存里面的库存的度量值了。

当然库存又会根据不同的时间点的状态分为期初库存和期末库存,关于期初和期末智能库存的度量值可以在我的课程里面学习。

https://jiaopengzi.com/video/video-101?rkvid=100

0003_产品数量_库存_期末 =
VAR DATE_START0 =
CALCULATE ( FIRSTDATE ( '01_Calendar'[C01_Dates] ), ALL ( '01_Calendar' ) )
VAR DATE_END0 =
LASTDATE ( '01_Calendar'[C01_Dates] )
VAR DATE_TABLE0 =
DATESBETWEEN ( '01_Calendar'[C01_Dates], DATE_START0, DATE_END0 )
VAR IN0 =
CALCULATE ( [0001_产品数量_入库], DATE_TABLE0 )
VAR OUT0 =
CALCULATE ( [0002_产品数量_出库], DATE_TABLE0 )
VAR DATE_START_ABS0 =
CALCULATE ( LASTDATE ( 'T04_订单主表'[F_04_送货日期] ), ALL () ) //兼容显示到事实表最后日期。
RETURN
IN0 - OUT0
//IF(DATE_START_ABS0>=DATE_END0,IN0 - OUT0,BLANK())

0004_产品数量_安全库存

本案例里面最重要的度量值;如果对中间过程理解有困难的,可以使用我们为大家准备的 Excel 辅助校验表来体会。

具体使用案例附件 Power BI 文件中的第二页《P2校验数据》导出对应的数据,在附件 Excel 《安全库存步骤分解》中分布体会。

Excel 里面有公式方便理解。

0004_产品数量_安全库存 =
/*
分布按照理想状态的标准正太分布,安全库存仅作为参考点,实际生产中需要加入业务的理解,进行调整。
SS = z * SQRT ( σd ^ 2 * μL + σL ^ 2 * μd ^ 2 )
SS:安全库存(Safe Stock)。
z : 服务水平系数,服务水平(现货率)为 0.95,在标准正太分布下对应的 z = 1.65。
L : 采购提前期,本案例中对应入库间隔天数。
μL: 平均提前期。
σL: 提前期 L 的标准差。
d : 日出库数量。
μd: 平均日出库数量。
σd: 日出库量 d 的标准差。
*/ VAR N = [02_ROW 值]//默认30天
VAR DATE_END0 =
LASTDATE ( '01_Calendar'[C01_Dates] )
VAR DATE_START0 =
DATEADD ( DATE_END0, - N + 1, DAY ) // 注意不包含边界。
VAR DATE_Table0 =
DATESBETWEEN ( '01_Calendar'[C01_Dates], DATE_START0, DATE_END0 )
VAR T01 =
CALCULATETABLE ( 'T03_入库信息表', DATE_Table0 )
VAR T02 =
SUMMARIZE (
T01,
'01_Calendar'[C01_Dates],
'T00_产品表'[F_01_产品编号],
'T01_门店表'[F_01_门店编号],
"@入库", [0001_产品数量_入库]
)
VAR T03 =
SUMMARIZE (
T02,
[F_01_产品编号],
[F_01_门店编号],
"@μL",
VAR P0 = [F_01_产品编号]
VAR M0 = [F_01_门店编号]
VAR T_FILTER =
FILTER ( T02, [F_01_产品编号] = P0 && [F_01_门店编号] = M0 )
VAR DATE_MAX =
MAXX ( T_FILTER, [C01_Dates] )
VAR DATE_MIN =
MINX ( T_FILTER, [C01_Dates] )
VAR DAY_DIFF =
DATEDIFF ( DATE_MIN, DATE_MAX, DAY )
VAR T_ROWS =
COUNTROWS ( T_FILTER ) - 1 // 注意去除边界减 1 。
RETURN
DIVIDE ( DAY_DIFF, T_ROWS, 0 ),
"@σL",
VAR P0 = [F_01_产品编号]
VAR M0 = [F_01_门店编号]
VAR T_FILTER =
FILTER ( T02, [F_01_产品编号] = P0 && [F_01_门店编号] = M0 )
VAR T_INDEX =
SUBSTITUTEWITHINDEX (
ADDCOLUMNS ( T_FILTER, "@date", [C01_Dates] ),
"@INDEX", T_FILTER,
[C01_Dates], ASC
)
VAR T_INDEX_N =
ADDCOLUMNS (
T_INDEX,
"@N",
VAR INDEX0 = [@INDEX]
VAR T_1 =
FILTER ( T_INDEX, [@INDEX] = INDEX0 - 1 )
VAR DATE_1 =
MAXX ( T_1, [@date] )
VAR N0 =
DATEDIFF ( DATE_1, [@date], DAY )
RETURN
N0
)
VAR T_INDEX_N_NOT_BLANK =
FILTER ( T_INDEX_N, [@N] <> BLANK () )
RETURN
IFERROR ( STDEVX.S ( T_INDEX_N_NOT_BLANK, [@N] ), 0 )
)
VAR T11 =
CALCULATETABLE (
'T05_订单子表',
DATE_Table0,
USERELATIONSHIP ( 'T04_订单主表'[F_04_送货日期], '01_Calendar'[C01_Dates] )
) //送货日期需要激活关系。
VAR T12 =
SUMMARIZE (
T11,
'01_Calendar'[C01_Dates],
'T00_产品表'[F_01_产品编号],
'T01_门店表'[F_01_门店编号],
"@出库", [0002_产品数量_出库]
)
VAR T13 =
SUMMARIZE (
T12,
[F_01_产品编号],
[F_01_门店编号],
"@μd",
VAR P0 = [F_01_产品编号]
VAR M0 = [F_01_门店编号]
VAR T_FILTER =
FILTER ( T12, [F_01_产品编号] = P0 && [F_01_门店编号] = M0 )
VAR AVG0 =
AVERAGEX ( T_FILTER, [@出库] )
RETURN
AVG0,
"@σd",
VAR P0 = [F_01_产品编号]
VAR M0 = [F_01_门店编号]
VAR T_FILTER =
FILTER ( T12, [F_01_产品编号] = P0 && [F_01_门店编号] = M0 )
VAR STDE0 =
IFERROR ( STDEVX.S ( T_FILTER, [@出库] ), 0 )
RETURN
STDE0
)
VAR T =
NATURALINNERJOIN ( T03, T13 )
VAR z = [0010_产品数量_安全库存_z]
VAR SS =
//SS= z * SQRT( σd ^ 2 * μL + σL ^ 2 * μd ^ 2 )
SUMX ( T, z * SQRT ( [@σd] ^ 2 * [@μL] + [@σL] ^ 2 * [@μd] ^ 2 )
)
RETURN
SS

三、总结

1、安全库存作为库存管理的一种重要参考,本案例中使用的是标准正太分布的理性情况,所以在实际的生产生活中还要根据业务特点再调整。

2、本案例给出了一种统计学意义下安全库存使用 DAX 计算思路。

3、另外关于库存计算的理解,历史累计对应到 DAX 中也就很好写了,首先找到业务的时间起点,因为时间起点不会变,也可以直接写死,再找到当前的时间点,结合 DATESBETWEEN 就能构建我们需要的各种业务时间描述了。

by 焦棚子

155_模型_Power BI & Power Pivot 进销存之安全库存的更多相关文章

  1. 151-模型-Power BI&Power Pivot模型DAX函数使用量分析

    151-模型-Power BI&Power Pivot模型DAX函数使用量分析 1.背景 我们在 Power BI 或者 Power Pivot 项目中会写很多的 DAX 表达式.在最后项目交 ...

  2. 158_模型_Power BI 使用 DAX + SVG 打通制作商业图表几乎所有可能

    158_模型_Power BI 使用 DAX + SVG 打通制作商业图表几乎所有可能 一.背景 最近对 Power BI 中使用 SVG 比较感兴趣,今天我们使用 DAX + SVG 复刻一下 Ze ...

  3. 159_模型_Power BI 地理分析之形状地图

    159_模型_Power BI 地理分析之形状地图 声明以下地图元素仅供学习交流所用,如需地图公开使用请提前做好报审工作. 一.背景 当企业的体量达到一定体量的时候,保持稳定的增长是非常重要的事情.本 ...

  4. 浩瀚技术团队... 安卓智能POS移动PDA开单器 开单器 进销存系统 进销存系统

    浩瀚技术团队... 智能POS移动PDA开单器 开单器 进销存系统 进销存系统 点餐 会员管理 会员管理 深度解读 手机APP移动办公到底是什么? 快速打单POS·不仅仅是快那么简单!  

  5. 寒冬之下,浩瀚智能开单收银打印扫描POS为何能在批发零售门店商场 车销行业 风靡!:进销存+打印扫描POS机

    是一款适用于商超.餐饮.服装鞋帽.家电专营等等具有零售行业特点的企业,供企业管理人员用于管理.监控本品牌的市场占有率.门店覆盖区域.网点分布合理性等经济地理信息的工具平台. 1,功能一:业务抄单文章来 ...

  6. PDA手持机 移动开单进销存系统 现场出打印凭据和扫码 新的亮点

    传统车销模式弊端:1.手写开单,效率低,动作慢2.现场手写开单明细不能打印,产品明细不规范3.电脑办公人员及车销人员对车上的库存情况掌握不清楚,销售人员对每种产品销售价格不清楚4.老板对员工工作的管控 ...

  7. 【.NET实战教程】北风网基于ASP.NET多层架构下的企业级进销存软件全程培训

    .Net进销存系统详细课程大纲(开发工具采用VS2008+sqlsever2005) [小编提醒:现在学习的话,可以使用vs2012+sql 2008 学习的是思路,教学环境不一定要一模一样]1.项目 ...

  8. Net通用进销存管理系统 + 开发文档+ 使用说明

    通用进销存管理系统 + 开发文档+ 使用说明Net源码下载 包括下面的模块基础资料模块采购管理模块库存管理模块商务管理模块营业管理模块维修管理模块会员管理模块财务管理模块 Net通用进销存管理系统 + ...

  9. 一秒钟看懂SaaS、CRM、OA、ERP、HR、进销存

    自2014年以来,SaaS.CRM.OA.ERP.HR.APM.进销存.财务系统等,这些名词大量出现在微信朋友圈.电视楼宇广告和千百万融资资讯中.它们到底是什么意思?相互之间又有什么区别?在这个飞速发 ...

随机推荐

  1. ABP源码分析 - 约定注册(2)

    比较随意,记录下过程,以便忘了以后重拾. 所谓约定注册是指不需要明确写代码注入,只需要按约定规则写服务类,框架自动完成服务注册. 例如,只要这样写,框架就会自动注册. public class Tax ...

  2. Java线程内存模型-JVM-底层原理

    public class Demo1 { private static boolean initFlag=false; public static void main(String[] args) t ...

  3. 电机三环pid控制及调试经验

    一.伺服电机的双环pid 双环pid在正常底盘运动的控制中已经足够了,但是对于双轴云台的控制来说,双环pid的云台控制的响应速度是远远不够的,所以加入了电流环的控制. 两篇大佬的文章--这是我学习pi ...

  4. python数据类型内置的方法

    数据类型的内置方法 在日常生活中不同类型的数据具有不同的功能 eg:表格数据文件具有处理表格的各项功能(透视表 图形化 公式计算) 视频数据文件具有快进 加速等各项功能 ... 1.整型int # 方 ...

  5. Java学习day2

    今天学习了Java的数据类型.运算符.选择循环结构以及数组. Java所有的关键字全部小写 Java的数据类型与c语言相似,但是c语言定义数组时可以不主动对其初始化,而Java则必须先初始化,有动态和 ...

  6. Java学习day11

    如果程序出现了问题,我们没有做任何处理,JVM会做默认处理,即:把异常的名称,原因和位置等信息输出在控制台,程序停止执行 一个简单的检测集合对象是否含有某元素,有就再添加一个某元素 public cl ...

  7. flutter常用命令--不定期更新

    // 更新flutter flutter upgrade // Dart 构造函数默认值 ImageGridView({Key key, this.imgs, this.isEdit: false}) ...

  8. VulnHub-Earth 打靶记录

    目录 VulnHub-Earth 打靶记录 知识点 目标探测 信息收集 Shell反弹&信息二次收集 提权 权限维持 VulnHub-Earth 打靶记录 搭建靶场的时候一定要使用NATser ...

  9. 关于C++类定义中不能声明该类对象,而Java中可以的原因

    相信接触过C++的人,在学习Java的过程当中,会遇到这样一个问题:在Java中常常会在类定义中声明一个该类的对象(例如Person类定义中声明一些叫parents之类的Person对象),但是在C+ ...

  10. Android 12(S) 图像显示系统 - SurfaceFlinger 之 VSync - 中篇(十七)

    必读: Android 12(S) 图像显示系统 - 开篇 1 前言 这一篇文章,将继续讲解有关VSync的知识,前一篇文章 Android 12(S) 图像显示系统 - SurfaceFlinger ...