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

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 焦棚子

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

勒索病毒“顽疾”,没有“特效药”吗?

基础设施瘫痪、企业和高校重要文件被加密、毕业论文瞬间秒没……这就是六年前的今天,WannaCry勒索攻击爆发时的真实场景。攻击导致150多个国家数百万台计算机受影响,也让勒索病毒首次被全世界广泛关注。 六年后,勒索攻击仍是全球最严重的网络…

Kali E:Unable to locate package错误解决

默认的新装的kali 可能都会遇到这个安装报错E: Unable to locate package httrack问题,今天我记录下彻底解决过程和效果。 Command httrack not found, but can be installed with: apt install httrack Do you want to install it? (N/y)y apt install httrack Re…

什么是域名流量劫持?

作为传统的互联网攻击方式,域名流量劫持已经十分常见,这种网络攻击将会在不经授权的情况下控制或重定向一个域名的DNS记录。域名劫持的影响难以估量,因为它可以导致在访问一个网站时,用户被引导到另一个不相关的网站,对…

深入理解java虚拟机精华总结:运行时栈帧结构、方法调用、字节码解释执行引擎

深入理解java虚拟机精华总结:运行时栈帧结构、方法调用、字节码解释执行引擎 运行时栈帧结构局部变量表操作数栈动态连接方法返回地址 方法调用解析分派静态分派动态分派 基于栈的字节码解释执行引擎 运行时栈帧结构 Java虚拟机以方法作为最基本的执行单元&#xf…

Vue3 自定义指令让元素自适应高度,el-table在可视区域内滚起来

我始终坚持,前端开发不能满足于实现功能,而是需要提供优秀的交互与用户体验。即使没有产品没有UI的小项目,也可以自己控制出品质量,做到小而美。所以前端们不仅仅需要了解框架如何用,还要学习一些设计、交互、体验的知…

诗圣杜甫不同时期的代表作

杜甫一生大致分为四个时期。 中青年时期 青年时,作为官三代的杜甫并不缺钱,四处游历,与李白、高适唱和、仙游,成为佳话。这个时期杜甫的作品热血豪迈,气势蓬勃。代表作首推《望岳》: 岱宗夫如何&#xf…

2023/5/8总结

JAVA基础知识(2) 1.方法 1、方法定义 格式:public static void 方法名(){ //方法体 } 2、方法调用 格式:方法名(); 3、方法的通用格式 public static 返回值类型方法名&…

C++面向对象(黑马程序员)

内存分区模型 #include<iostream> using namespace std;//栈区数据注意事项&#xff1a;不要返回局部变量的地址 //栈区的数据由编译器管理开辟和释放int* func(int b) //形参数据也会放在栈区 {b 100;int a 10; //局部变量存放在栈区&#xff0c;栈区的数据在函数执…

存bean和取bean

准备工作存bean获取bean三种方式 准备工作 bean:一个对象在多个地方使用。 spring和spring boot&#xff1a;spring和spring boot项目&#xff1b;spring相当于老版本 spring boot本质还是spring项目&#xff1b;为了方便spring项目的搭建&#xff1b;操作起来更加简单 spring…

vue+express+mysql做一个简单前后端交互,从数据库中读取数据渲染到页面

1.下载上次的包 npm I &#xff0c;同时下载新的包 axios 2.打开数据库服务器&#xff0c;同时使用新建数据库一样&#xff0c;数据包名 3.新建一个项目 4.全局注册axios 5.新建一个server文件夹&#xff08;里面在建一个index.js的主文件&#xff09;用来放我们后端写的东西 …

数据结构与算法基础(王卓)(36):交换排序之快排【第三阶段:深挖解决问题】精华!精华!精华!!!重要的事情说三遍

目录 Review&#xff1a; 具体问题&#xff1a; 操作核心&#xff1a; 注&#xff1a; 操作分解&#xff1a; 操作实现&#xff1a; 问题&#xff08;1&#xff09;&#xff1a;进行不一样次数的 if / else 判断 问题&#xff08;2&#xff09;&#xff1a;通过判断条件…

TypeScript 最近各版本主要特性总结

&#xff08;在人生的道路上&#xff0c;当你的期望一个个落空的时候&#xff0c;你也要坚定&#xff0c;要沉着。——朗费罗&#xff09; TypeScript 官网 在线运行TypeScript代码 第三方中文博客 特性 typescript是javascript的超集&#xff0c;向javascript继承额外的编辑…

2023鲁大师评测沟通会:鲁大师尊享版登场、“鲁小车”正式上线

作为硬件评测界的“老兵”&#xff0c;鲁大师不仅有着十几年的硬件评测经验&#xff0c;并且一直都在不断地尝试、不断地推陈出新。在5月9日举行的“2023年鲁大师评测沟通会”上&#xff0c;鲁大师向大众展示了在过去一年间取得的成果。 PC业务迭代升级&#xff0c;鲁大师客户端…

干货满满!破解FP安全收款难题

怎样安全收款是做擦边产品卖家比较忧虑的问题&#xff0c;2023年已经即将来到了年中&#xff0c;跨境卖家们在这一方面做得怎么样了呢&#xff1f; 这期分享破解FP独立站收款难题的方法。 一、商家破解FP收款难题方法 1.第三方信用通道 优点&#xff1a;信用卡在国外使用率比…

好家伙,又一份牛逼笔记面世了...

最近网传的一些裁员的消息&#xff0c;搞的人心惶惶。已经拿到大厂offer的码友来问我&#xff1a;大厂还能去&#xff0c;去了会不会被裁。 还在学习的网友来问我&#xff1a;现在还要冲互联网么&#xff1f; 我是认为大家不用恐慌吧&#xff0c;该看啥看啥&#xff0c;该学啥…

ASEMI代理ADI亚德诺ADUM3211TRZ-RL7原厂芯片

编辑-Z ADUM3211TRZ-RL7参数描述&#xff1a; 型号&#xff1a;ADUM3211TRZ-RL7 数据速率&#xff1a;10 Mbps 传播延迟&#xff1a;50 ns 脉冲宽度失真&#xff1a;3 ns 脉冲宽度&#xff1a;100 ns 输出上升/下降时间&#xff1a;2.5 ns 供电电流&#xff1a;2.6 mA …

Maven与spring学习

目录 该如何学习Maven&#xff0c;是先该学习spring还是先学习Maven 能讲一下该如何学习Maven吗&#xff1f; 火狐浏览器有能让网页翻译成为中文的插件吗 秋田和柴犬是同一个狗吗 该如何学习Maven&#xff0c;是先该学习spring还是先学习Maven 学习Maven可以与学习Spring同…

一键安装k8s脚本

服务器配置 节点(华为云服务器)配置master 2vCPUs | 4GiB | s6.large.2 CentOS 7.8 64bit node1 2vCPUs | 8GiB | s6.large.4 CentOS 7.8 64bit node2 2vCPUs | 8GiB | s6.large.4 CentOS 7.8 64bit 1.master节点安装脚本&#xff1a;install_k8s_master.sh。 sh文件上传到…

2023数维杯数学建模ABC题思路分析

占个位置吧&#xff0c;开始在本帖实时更新数维杯数学建模赛题思路代码&#xff0c;文章末尾获取&#xff01; 持续为更新参考思路 赛题思路 已完成全部可以领取&#xff0c;详情看文末&#xff01;&#xff01;&#xff01; 数维杯A题思路 A题是这次比赛比较难的题目&…

windows下升级nodejs

重新安装新版nodejs 重新安装nodejs然后设置环境变量 安装yarn npm install -g yarn --registryhttps://registry.npm.taobao.org yarn config set registry https://registry.npm.taobao.org -g yarn config set sass_binary_site http://cdn.npm.taobao.org/dist/node-sa…