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

Posted 焦棚子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了177_模型_Power BI 进销存6大日期维度期初与期末相关的知识,希望对你有一定的参考价值。

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

一、背景

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

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

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

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

二、模型与DAX

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

表间关系如下:

主要度量值

01_入库

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

02_出库

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

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

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

维度表, 事实表, 数据仓库, BI...

 

以前一直对维度表, 事实表, 数据分析, BI等概念等有一些模糊. 这几天的学习终于让这些有了一些眉目了:

维度表示你要对数据进行分析时所的一个量, 比如你要分析产品销售情况, 你可以选择按类别来进行分析,或按区域来分析. 这样的按..分析就构成一个维度。前面的示例就可以有两个维度:类型和区域。另外每个维度还可以有子维度(称为属性),例如类别可以有子类型产品名等属性。下面是两个常见的维度表结构:

产品维度表:Prod_id, Product_Name, Category, Color, Size, Price 时间维度表:TimeKey, Season, Year, Month, Date

而事实表是数据聚合后依据某个维度生成的结果表。它的结构示例如下:

销售事实表:Prod_id(引用产品维度表), TimeKey(引用时间维度表), SalesAmount(销售总量,以货币计), Unit(销售量)

上面的这些表就是存在于数据仓库中的。从这里可以看出它有几个特点:

1. 维度表的冗余很大,主要是因为维度一般不大(相对于事实表来说的),而维度表的冗余可以使事实表节省很多空间。 2. 事实表一般都很大,如果以普通方式查询的话,得到结果一般发的时间都不是我们可以接受的。所以它一般要进行一些特殊处理。如SQL Server 2005就会对事实表进行如预生成处理等。 3. 维度表的主键一般都取整型值的标志列类型,这样也是为了节省事实表的存储空间。

以上是关于177_模型_Power BI 进销存6大日期维度期初与期末的主要内容,如果未能解决你的问题,请参考以下文章

power bi一组数据但它跨日期了变成了两组数据

power BI OTD不同的日期如何设置report 时间

power bi HR 数据分析

Power BI KPI MATRIX

如何根据 Power BI 报表中选定的月份筛选器在 MDX 查询中显示最近六个月的数据(每个月一行)?

power bi如何制作地图数据表?power bi如何在地图上标出数据啊?