zoukankan      html  css  js  c++  java
  • DAX/PowerBI系列

    DAX/PowerBI系列 - 关于时间系列 - 时间相关数值比较 - 用非自带函数

     文末有彩蛋,解决蛋疼问题

    难度: ★☆☆☆(2星)

    适用范围: ★(3星)

    概况:

    基于时间的汇总可能是最基础、最普遍用到的计算之一:计算年度销售总额,计算月度消费金额,某个店某个时期的销售情况等等。
    这里的时间模式介绍用DAX实现时间相关的计算,它不依赖于DAX自带的时间函数(譬如YTD,MTD等等)。
    如果你有特殊的日历,特定特定时间段的计算(例如:按周计算、按trimester计算),用这个这个模式都能够解决。

    此文涉及前文DAX/PowerBI系列 - 参数表(Parameter Table) - 多时间段数值对比的扩展部分,给出具体实例和解决方法。
    日期维度表参见:如何生成日期维度表

    应用场景:

    以下是几个应用场景:

    • 计算年底销售总额
    • 计算月度流量总额
    • 进一步计算同比,环比

    最终PowerBI效果显示如下(耐心等待PowerBI 出来,噔噔噔噔~~~)

     https://app.powerbi.com/view?r=eyJrIjoiYzZlYzgxYzItZTA1ZC00ODVmLTlkNjUtZGRlYjdlMDFjOWNlIiwidCI6ImQxYWY4NDdiLTJjZTEtNDRjYi1iYjUwLWQ1ODAyYmI0M2M4YiIsImMiOjEwfQ%3D%3D

    欢迎转载,请保留原文链接和作者信息。O(∩_∩)O谢谢。
    DAX/PowerBI系列 - 参数表(Parameter Table) 度量值模板(Period Table)
    作者:马丁叔叔             链接:http://www.cnblogs.com/lizardbi/p/DAX-PATTERN-POWERBI-Parameter-Table-Period-Table-Extension.html

    数据模型:

    Date(日期表)

    Product(产品表)

    Sales (销售表) 

    Inventory(库存表)

    要点:

    首先定义一个度量值(measure),它基于销售额列(SalesAmount),(注:销售额(SalesAmount)此列是数据表中的列,不是度量值)

    有些盆友觉得定义这个度量值是多余的,但是细看下面你就会发现这样定义是十分有用的:
    1.	易懂
    2.	简化引用这个度量值的其他度量值
    3.	易于维护
    

      

    度量值 Amount

    [Amount] := SUM(Sales[SalesAmount])

    月初至今 MTD

    [Amount MTD] :=
    CALCULATE (
        [Amount],
        FILTER (
            ALL ( 'Date' ),
            'Date'[Year] = MAX ( 'Date'[Year] )
                && 'Date'[Month] = MAX ( 'Date'[Month] ) 
                && 'Date'[Date] <= MAX ( 'Date'[Date] )
        )
    )

     月初至今(上月)  LMTD

    [Amount LMTD] :=
    VAR maxSalesDate =
        MAX ( 'Sales 0'[skDate] )
    VAR dateRng =
        FILTER ( ALL ( 'Date' ), 'Date'[Date] <= maxSalesDate )
    RETURN
        CALCULATE ( [Amount MTD], DATEADD ( 'Date'[Date], -1, MONTH ), dateRng )

    dateRng: 见文末详解。

    月初至今(去年) LYMTD

    1 [Amount LYMTD] :=
    2 VAR maxSalesDate =
    3     MAX ( 'Sales 0'[skDate] )
    4 VAR dateRng =
    5     FILTER ( ALL ( 'Date' ), 'Date'[Date] <= maxSalesDate )
    6 RETURN
    7     CALCULATE ( [Amount MTD], DATEADD ( 'Date'[Date], -1, YEAR ), dateRng )

    月度环比 MoM

    1 [MoM] :=
    2 IF (
    3     [Amount MTD] <> BLANK (),
    4     DIVIDE ( [Amount MTD] - [Amount LMTD], [Amount LMTD] )
    5 )

    月度同比 LMoM

    [LMoM] :=
    IF (
        [Amount MTD] <> BLANK (),
        DIVIDE ( [Amount MTD] - [Amount LYMTD], [Amount LYMTD] )
    )

    年初至今 YTD

    [Sales YTD] := 
    CALCULATE (
        [Amount], 
        FILTER (
            ALL ( 'Date' ), 
            'Date'[Year] = MAX ( 'Date'[Year] )
                && 'Date'[Date] <= MAX ( 'Date'[Date] )
        )
    )

     年初至今(去年)  LYTD

    [Amount LYTD] :=
    VAR maxSalesDate =
        MAX ( 'Sales 0'[skDate] )
    VAR dateRng =
        FILTER ( ALL ( 'Date' ), 'Date'[Date] <= maxSalesDate )
    RETURN
        CALCULATE ( [Amount YTD], DATEADD ( 'Date'[Date], -1, YEAR ), dateRng )

    年同比 YoY

    [YoY] :=
    IF (
        [Amount YTD] <> BLANK (),
        DIVIDE ( [Amount YTD] - [Amount LYTD], [Amount LYTD] )
    )

    ^如何在图表中显示LYTD,LMTD的数据

    一般来说日期表(Date)中含有的未来的月份,譬如未来5年的日期,或者事实表(Fact)中没有的日期,为了防止图表中显示出来LMTD,LYTD之类的,用这个筛选日期达到目的。

    例子:在事实表(Fact)中,最大的交易日期是2013-06-13。

    如图:

    左边因为2014年计算LYTD的时候不为空,所以X轴显示到了2014年到6月份,但是用最大的交易日期筛选后,就可以正常显示了。

    没有用dateRng筛选  用dateRng筛选
     
    [x Amount YTD] :=
    CALCULATE (
        [Amount],
        FILTER (
            ALL ( 'Date' ),
            'Date'[Year] = MAX ( 'Date'[Year] )
                && 'Date'[Date] <= MAX ( 'Date'[Date] )
        )
    )
      
    [Amount YTD] :=
    VAR maxSalesDate =
        MAX ( 'Sales 0'[skDate] )
    VAR dateRng =
        FILTER ( ALL ( 'Date' ), 'Date'[Date] <= maxSalesDate )
    RETURN CALCULATE ( [Amount], FILTER ( ALL ( 'Date' ), 'Date'[Year] = MAX ( 'Date'[Year] ) && 'Date'[Date] <= MAX ( 'Date'[Date] ) ), dateRng )
      

     

     


    最终效果

    参照 上文的PowerBI显示。

    Time-Pattern,日期度量值对比,度量值汇总, 同比,环比,YoY, MoM,库存对比,年度环比,月度环比

  • 相关阅读:
    SQL找出和删除一个表的重复记录
    "The state information is invalid for this page and might be corrupted"错误的一个解决办法
    优雅还不够,简洁才高效!——用NValidator一句话搞定客户端检测
    HTTP 错误 404 文件或目录未找到 HTTP 错误 401.2 未经授权:访问由于服务器配置被拒绝。
    来自微软关于异常处理的17条军规
    SQL回滚Transaction来调试SQL语句
    MyXls初级教程
    SQL常用判断检测语句
    纯CSS实现底部固定漂浮导航
    一个仿PetShop的通用DBHelper类
  • 原文地址:https://www.cnblogs.com/lizardbi/p/DAX-PATTERN-POWERBI-Time-Pattern.html
Copyright © 2011-2022 走看看