177_模型_Power BI 进销存6大日期维度期初与期末

news2024/11/15 11:07:22

177_模型_Power BI 进销存6大日期维度期初与期末

一、背景

在经销存报表设计中,经常会遇到的便是期初期末。当然我们这里说期初与期末指的是期初库存与期末库存。

这里的一般常见的会有:年月日。本案例将演示 6 大日期维度,分别是:日、周、月、季度、半年度、年度

先来看一下示例结果(**注意:**这里我们只是将6个日期维度进销存展示出来,里面还有很多变形需要结合实际业务去展开)。

Power BI 公共 web 效果:https://demo.jiaopengzi.com/pbi/177-full.html

图-01

二、模型与DAX

这里的示例模型都是我们常用的模型(https://jiaopengzi.com/1435.html)

表间关系如下:

图-02

主要度量值

01_入库

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

02_出库

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

入库和出库都是相对简单的聚合即可,需要注意的是,出库我们使用的送货日期,这里需要使用USERELATIONSHIP激活关系。

03_库存_期末

库存其实很好理解,就是累计的入库减去累计的出库即可。

这里需要注意:期初库存,期末库存都是 入库与出库通过计算衍生出来的,只要把入库和出库在各个时间节点上关系捋清楚了就很好理解了。

当然这里的入库和出库是泛指的,比如盘亏,盘盈,这些都要与之对应。

图-03

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

04_库存_期初

期初是在期末的基础上对各个日期维度做了兼容所以会看起来很复杂,其实相对比较简单,只要找到各个时间点的前一个粒度的期末即为期初。

如果只需要一个时间维度的话,可以将下面度量值简化。

04_库存_期初 = 
VAR DATE_START0 =
    CALCULATE ( FIRSTDATE ( 'A00_Calendar'[C01_Dates] ), ALL ( 'A00_Calendar' ) )
VAR DATE_END0 =
    LASTDATE ( 'A00_Calendar'[C01_Dates] )
VAR TF0 =
    HASONEVALUE ( A00_Calendar[C01_Dates] ) //日
VAR TF1 =
    HASONEVALUE ( 'A00_Calendar'[C12_YearWeek] ) //周
VAR TF2 =
    HASONEVALUE ( 'A00_Calendar'[C20_YearMonth] ) //月
VAR TF3 =
    HASONEVALUE ( 'A00_Calendar'[C24_YearQuarter] ) //季度
VAR TF4 =
    HASONEVALUE ( 'A00_Calendar'[C27_YearHalf] ) //半年度
VAR TF5 =
    HASONEVALUE ( 'A00_Calendar'[C29_FY00] ) //年度
VAR N0 =
    SWITCH (
        TRUE (),
        TF0, 0,
        TF1,
            DATEDIFF (
                FIRSTDATE ( 'A00_Calendar'[C31_StartOfWeek] ),
                LASTDATE ( 'A00_Calendar'[C36_EndOfWeek] ),
                DAY
            ),
        TF2,
            DATEDIFF (
                FIRSTDATE ( 'A00_Calendar'[C32_StartOfMonth] ),
                LASTDATE ( 'A00_Calendar'[C37_EndOfMonth] ),
                DAY
            ),
        TF3,
            DATEDIFF (
                FIRSTDATE ( 'A00_Calendar'[C33_StartOfQuarter] ),
                LASTDATE ( 'A00_Calendar'[C38_EndOfQuarter] ),
                DAY
            ),
        TF4,
            DATEDIFF (
                FIRSTDATE ( 'A00_Calendar'[C34_StartOfHalfYear] ),
                LASTDATE ( 'A00_Calendar'[C39_EndOfHalfYear] ),
                DAY
            ),
        TF5,
            DATEDIFF (
                FIRSTDATE ( 'A00_Calendar'[C35_StartOfYear] ),
                LASTDATE ( 'A00_Calendar'[C40_EndOfYear] ),
                DAY
            ),
        0
    ) + 1
VAR DATE_END1 =
    SWITCH (
        TRUE (),
        TF0, DATEADD ( DATE_END0, - N0, DAY ),
        TF1, DATEADD ( LASTDATE ( 'A00_Calendar'[C36_EndOfWeek] ), - N0, DAY ),
        TF2, DATEADD ( LASTDATE ( 'A00_Calendar'[C37_EndOfMonth] ), - N0, DAY ),
        TF3, DATEADD ( LASTDATE ( 'A00_Calendar'[C38_EndOfQuarter] ), - N0, DAY ),
        TF4, DATEADD ( LASTDATE ( 'A00_Calendar'[C39_EndOfHalfYear]), - N0, DAY ),
        TF5, DATEADD ( LASTDATE ( 'A00_Calendar'[C40_EndOfYear] ), - N0, DAY ),
        DATE_START0 //无筛选的时,默认日期表期初。
    )
VAR DATE_END2 =
    IF ( ISBLANK ( DATE_END1 ), DATE_START0, DATE_END1 ) //兼容dateadd后的空值,注意日期表的两个端点。
VAR DATE_TABLE0 =
    DATESBETWEEN ( A00_Calendar[C01_Dates], DATE_START0, DATE_END2 )
VAR IN0 =
    CALCULATE ( [01_入库], DATE_TABLE0 )
VAR OUT0 =
    CALCULATE ( [02_出库], DATE_TABLE0 )
VAR DATE_START_ABS0 =
    CALCULATE ( LASTDATE ( 'T04_订单主表'[F_04_送货日期] ), ALL () ) //兼容显示到事实表最后日期。
RETURN
    IN0 - OUT0
//IF ( DATE_START_ABS0 >= DATE_END2, IN0 - OUT0, BLANK () )

三、总结

  1. 这里的期初期末都需要和日期表配合,特别是期初,需要和我们调制的日期表( https://jiaopengzi.com/2916.html )配合。
  2. 要捋清楚,入库出库都是实在发生的(包括盘亏盘盈),期初库存,期末库存还有安全库存( https://jiaopengzi.com/2753.html )这些指标都是通过实际入库出库衍生计算出来的。

附件下载

https://jiaopengzi.com/2990.html


请关注

全网同名搜索 焦棚子

如果对你有帮助,请 点赞关注三连 支持一下,这是我们更新的动力。

by 焦棚子

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/505493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(二)运行微信小程序:单页面和多页面

使用微信开发者工具创建项目后,默认将运行一个单页面的小程序,运行效果和文件对应修改处如下。 根据上图,通过修改对应内容,可以修改界面显示的文字。 这是一个单页面的小程序,假如要实现多页面的小程序,我…

基于matlab使用被动声纳系统定位声学信标

一、前言 此示例演示如何模拟被动声纳系统。固定的水声信标由浅水通道中的拖曳无源阵列检测和定位。声信标以每秒 10.37 千赫兹的速度传输 5 毫秒脉冲,并建模为各向同性投影仪。定位器系统在表面下方拖曳一个无源阵列,该阵列被建模为均匀线性阵列。一旦检…

电磁兼容三要素和三规律

EMC是业界的一个难点;来谈谈EMC三个规律、EMC问题三要素、电磁骚扰的特性、以及五层次EMC设计法。 EMC改进要如诊治疾病一样对症施治;我们倡导坚持EMC规律,趁早考虑和解决EMC问题-进行EMC设计。下面我们认识以下EMC领域的三个要 素和三个重要…

二十四、SQL 数据分析实战(12个简单的SQL题目)

文章目录 题目1: "双十一"活动的电商GMV分析题目2: 网站访问量分析题目3: 用户购物信息统计题目4: 连续售出的商品题目5: 奇偶互换位置题目6: 商品销量同环比题目7: 文本记录连接题目8: 行列互换题目9: 寻找符合要求的订单题目10: 优惠券使用分析题目11: 员工绩效考核…

国产仪器 3986A/3986D/3986E/3986F/3986H噪声系数分析仪

3986系列噪声系数分析仪产品包括3986A(10MHz~4GHz)、3986D(10MHz~18GHz)、3986E(10MHz~26.5GHz)、3986F(10MHz~40GHz)和3986H(10MHz~50GHz),具有频率覆盖范围宽、频段选择灵活、接收灵敏度高、用户界面友好…

玩客云直刷armbian自带宝塔7.5

文章目录 前言一、短接玩客云1.1、流程1.2、短接操作 二、获取固件底包2.1、下载固件2.2、刷入成功后获取ip地址2.3、登陆2.4、其他 总结 前言 一开始25买了一个玩客云(主机电源)玩玩,成功刷入armbian,但是就是安装不了宝塔&…

MGV2000_2+16_当贝纯净桌面卡刷固件包-内有教程

MGV2000_216_当贝纯净桌面卡刷固件包-内有教程 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软件,运行速度提…

什么是零拷贝?

零拷贝 什么是零拷贝 零拷贝指的是,从一个存储区域到另一个存储区域的copy任务无需CPU参与就可完成。零拷贝的底层是 通过DMA总线技术实现的。零拷贝与具体的编程语言无关,完全依赖于OS,OS支持就可使用,不支持 设置了也不起作用…

MySQL基础(二十二)逻辑架构

1.逻辑架构剖析 1.1 第1层:连接层 系统(客户端)访问MySQL服务器前,做的第一件事就是建立TCP连接。 经过三次握手建立连接成功后,MySQL服务器对TCP传输过来的账号密码做身份认证、权限获取。 用户名或密码不对&#…

单脉冲测角和差波束法原理

和差波束测角及仿真 和差波束法原理MATLAB仿真 和差波束法原理 和差波束法是等信号测角方法中的一种,该方法利用两个形状完全相同但是部分重叠的波束,两个波束再形成和波束和差波束,由和差波束测量目标回波的入射角。 如下图所示&#xff0c…

seL4 操作系统微内核生态-ACM协会

美国计算机协会 (ACM) 将 2022 年 ACM 软件系统奖项授予 seL4 微内核团队。 SeL4是世界上第一个通过数学方法被证明安全的操作系统内核,并且在安全的基础上还强调高性能,是世界上最快、最先进的 OS 微内核。它对于嵌入式计算系统的安全可信赖方面将会有极…

先人一步了解Go 1.21版本新特性前瞻

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"! 作者:tonybai|慕课网讲师 正在如火如荼地开发当中,按照Go核心团队的一年两次的发布节奏来算,Go 1.21…

【Java入门合集】第四章继承(二)

博主:命运之光 专栏:JAVA入门 学习目标 1.掌握继承性的主要作用、实现、使用限制; 2.掌握this和super的含义及其用法; 3.掌握方法覆写的操作; 4.掌握final关键字的使用; 5.掌握类变量、实例变量和局部变量的…

Cyanine5 maleimide马来酰亚胺活化荧光染料Cy5;1437872-46-2

CY5-MAL细胞标记是一种用于标记细胞的荧光染料,它可以被用于多种应用中。首先,CY5-MAL细胞标记可以被用于活细胞成像。通过将CY5-MAL细胞标记与活细胞结合,可以使细胞在显微镜下清晰可见。这种技术可以被用于研究细胞的结构和功能。其次&…

linux彻底卸载mysql步骤

第一步,先查看是否安装了mysql mysql -u root -p 如果提示bash: mysql: command not found...则没有安装过mysql 如果提示需要输入密码,那就证明安装了mysql 第二步,查看mysql运行状态并关闭 先查看下mysql的运行状态(如果已经…

redis(6)

基于redis中的list类型实现分页思路: list数据类型的应用场景: 1)对数据量大的集合做删减,比如说百度首页的热点新闻的列表,有一个换一换的功能,我们正是利用了list集合中的分页功能,使用lrange的命令,列表数据的显示&…

Anaconda——使用原因及创建方法

Anaconda——使用原因 一、使用原因二、创建虚拟环境的方法1、打开Anaconda Navigator2、点进Anaconda Powershell Prompt3、输入创建命令 参考文章 一、使用原因 Anaconda包含很多库Anaconda可以 创建虚拟环境 ,满足不同工程的要求的工具版本不一致问题&#xff0…

JavaScript中的异步函数(async/await)

1、async:异步的,await:等待。 一、作为async标识的函数与正常函数有两个区别: 1、当我们用async来声明一个函数的时候就说明这个函数是异步函数了,但事实上被声明的函数仍然是会在后面js之前求值,代码如…

四通道电容式智能门锁触摸芯片GT304L

智能门锁是指区别于传统机械锁的基础上改进的,在用户安全性、识别、管理性方面更加智能化简便化的锁具。智能门锁是门禁系统中锁门的执行部件。智能门锁区别于传统机械锁, 是具有安全性, 便利性, 技术的复合型锁具。使用非机械钥匙作为用户识别ID的成熟技术&#xf…

分布式事务(CAP定理和BASE理论)

CAP定理 分布式系统无法同时满足这三个指标,这个结论就叫做CAP定理。 分布式系统三个指标: Consistency (一致性)Availability (可用性)Partition tolerance(分区容错性) Consistency (一致性) 用户访问分布式系统中的任意节点,得到的数据必须一致 A…