从教师节写到了今天~~~惭愧惭愧
越长大越觉得基础教育很重要。打好基础,灵活运用。你觉得最简单的东西也许会有其他的可能性。复杂的知识也都是从基础的知识推演过来的。所以现在有很多厉害的人投入到基础教育中,我觉得挺好的。
废话不多说,今天的需求如下:
如下图所示,基础数据里面有不同的区Region,在不同的Week里,产生了不同的价值Value,并且提供了在这个Week里面工作了多少天。其中源数据中的第三个字段“Value”对于Week的增加是一个累计值。所以我们要计算Value last week,并进一步得到每天产生的Daily value。分析工作效率。
数据准备分析:
1. Value last week
这个需求是求last week上周的数据值。在DAX里面没有直接求Last week的函数。有昨天PreviousDay,上个月PreviousMonth,上个季度PreviousQuarter还有上一年PreviousYear. 而且这个数据模型里没有时间维度表,所以用不了时间智能函数。
只能根据Week的值来得到上个月的Value
2. Daily value
这个值是依赖于Value last week存在的。
我们要得到上图中的“Daily value”字段。这个字段来自于,当前的“Value”字段的值,减去上周的Value的值,然后再除以一周工作了几天“Weekly Working days”这个字段。(字段名对应上图表格1中的字段名称)
Daily value = (Value - Value last week)/Weekly Work days
需要准备的数据分析完成之后,开始准备数据来解决问题了。
Step1: Enter Data创建一个数据表
为了简单,随便Enter了一个表制作了假数据。具体内容如下图所示。
创建了4个列,内容如下图所示:
官网输入数据做数据源的链接如下。
https://docs.microsoft.com/zh-cn/power-bi/connect-data/desktop-enter-data-directly-into-desktop
Step2:创建Value last week
这里,该创建一个Calculated Column计算字段还是Measures度量值呢?
我们先创建一个Measure度量值。
例如,建立了度量值Measures_Value_last_wek
Measures_Value_last_wek = VAr wk = MAX('Table'[Week])VAR n_wk = ("wk" & (MID(wk,3,2) -1))VAR n_value = CALCULATE(SUM('Table'[Value]),'Table'[Week] = n_wk)return n_value
DAX内容解析:
第一个变量wk,得到当前的week的值。(如果Week字段的值不包括在使用这个Measures_Value_last_wek的图表中的话,MAX(week)得到的是全部分week里面的最大值。本例子中就是wk3);
n_wk,Mid函数从第3个位置开始取2位数字,因为真实数据一般最大是52周,所以这里取了2位。函数返回一个数字,减一,得到上一个Week值;
n_value的计算,计算n_wk下的Value字段的总和。这里要注意要用All函数,否则
拉一个Visual图表,如下图所示。
好像还不错。有没有发现什么异常呢?
这个Total总合的90有点奇怪?这个就是之前提过的”如果“,如果没有包含Week字段的”值“。建立的这个Measure度量值,结果不一定总是正确的。这个取决于Visula图表里面有没有Week字段的值。
只有当你的Visual图表里面包括”Week“这个字段的值的时候,最大的Week值,也是最小的Week值,都等于在Visual图表中看到的唯一的那个Week值。只有这个时候,Measures_Value_last_wek的计算结果才是预期想要的,所以这里有个坑。这个简单需求里面,如果要包括这个汇总Total值,那这样写的Measures_Value_last_wek就是不对的。当然,也可以判断下hasonefilter这样的函数,然后针对汇总的结果,从新计算。这样做,在这个需求里面有点麻烦。毕竟我们这个是个简单的需求啊。
到这里,你会发现建立度量值也不是万能的。度量值会依赖于和她一起的其他字段,动态的计算结果。这是她的特点,利用这个特点,有时候很快就解决问题,同时也许会挖一个坑。
所以,到这里,大概有点感觉了。对于这种需要逐行考虑得到的字段。就应该创建Calculated Column计算字段。
创建计算列如下图所示:
Column_Value_last_wek = VAr wk = 'Table'[Week]VAR n_wk = ("wk" & (MID(wk,3,2) -1))VAR n_value = CALCULATE(SUM('Table'[Value]),'Table'[Week] = n_wk)return n_value
内容基本一样。对应表中的每一条Week值计算结果。没有用MAX函数。
得到结果如下:
好了,躲过了坑。然后开始计算Daily value这个字段。
Daily value的计算顺序是,先根据表中的数据逐条计算出每一个Daily Value。然后根据不同的Region或者Week汇总计算和。
这里写了两种方法。
第一种,建立了一个Measures度量值。内容如下:
Value_per = SUMX(SUMMARIZE('Table','Table'[Region],'Table'[Week],"days",DIVIDE((SUM('Table'[Value])-SUM('Table'[Column_Value_last_wek])),AVERAGE('Table'[Work Days]))),[days])
这个数据表还是简单的,里面只有Region和Week两个描述字段,要是多了,估计我就懒得写这个度量值了。
第二种,建立一个Calculated column计算列。内容如下:
per_day = DIVIDE(('Table'[Value] - 'Table'[Column_Value_last_wek]),'Table'[Work Days])
所以,如果数据是到数据表的最细粒度的计算,啥也别说了,直接用Calculated Column计算列就好了。简单,明了。
本文感谢Jun小姐姐。给了我很多启示,为我提供了这篇文章的素材。谢谢!也感谢Tony同学,帮我审稿,提意见。
那个,最后说一点,如果需要分享源文件的,请给我留一个邮箱和具体哪个文章。最开始的可能不一定还有,只要有的,尽量分享。
DAX基础14的百度网盘地址如下,自取
链接: https://pan.baidu.com/s/1uwKLJin04qs0FnRkmF18Vg
提取码: mge9
感谢关注。谢谢转发分享哦~~