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. Python pip下载慢的解决方法

    国外的源下载速度实在是太慢了 可以使用国内的一些镜像网站安装 使用cmd命令 格式:pip install -i 网站 库 例如: 国内的一些镜像网站 清华大学:https://pypi.tuna.t ...

  2. vue中事件冒泡规则和事件捕获规则

    <div id="app"> <div @click="handleClickOne"> <p @click="hand ...

  3. video踩坑

    查看以及修改video控件样式,原文地址:https://blog.csdn.net/z2181745/article/details/82531686 chrome浏览器,F12调出控制台左上角三点 ...

  4. 微服务架构学习与思考(09):分布式链路追踪系统-dapper论文学习

    一.技术产生的背景 1.1 背景 先来了解一下分布式链路追踪技术产生的背景. 在现在这个发达的互联网世界,互联网的规模越来越大,比如 google 的搜索,Netflix 的视频流直播,淘宝的购物等. ...

  5. LC-242

    利用ASCII码构成哈希表来映射 和这题类似: https://leetcode-cn.com/problems/minimum-window-substring/solution/li-yong-a ...

  6. Spring基于注解自动装配

    前面我们介绍Spring IoC装载的时候,使用XML配置这种方法来装配Bean,这种方法可以很直观的看到每个Bean的依赖,但缺点也很明显:写起来非常繁琐,每增加一个组件,就必须把新的Bean配置到 ...

  7. C语言求最大公约数最小公倍数(多种方法)

    前言 这个求解方式多样化,灵活变动,但是,网上没有很好的资源和很全的代码,特此练习,敲打后,总结成本片文章. 单一求解 一.最大公约数 1.穷举法(最简单求解方式) 利用除法方式用当前的数字不断去除以 ...

  8. 使用 Nginx 实现 URL 的重定向

    1. 概述 老话说的好:取乎上,得其中:取乎中,得其下.因此我们不妨把目标定的高一些,去努力,才能得到更好回报. 言归正传,今天我们来聊聊 使用 Nginx 实现 URL 的重定向. 2. 使用 Ng ...

  9. VS Code失焦时自动保存编辑器内容

    vs code有一个非常好用的功能:就是自动保存. 而且不需要安装什么插件,只需要在编辑器设置就可以了.接下来我们一起来设置吧: 1.打开我们的vs code编辑器.在左下角有个  齿轮图标(管理), ...

  10. AngularJS ui-router 用resolve、service预先加载数据写法,属于优化性能方面吧

    AngularJS的service怎么声明此处就不再赘述,下面的例子是ui-router中使用service的实现代码 $stateProvider.state('myState', { url: & ...