DAX分享18:举例用Calculated Column还是Measures来实现工作效率分析结果

浏览: 1161

​从教师节写到了今天~~~惭愧惭愧

越长大越觉得基础教育很重要。打好基础,灵活运用。你觉得最简单的东西也许会有其他的可能性。复杂的知识也都是从基础的知识推演过来的。所以现在有很多厉害的人投入到基础教育中,我觉得挺好的。

废话不多说,今天的需求如下:

如下图所示,基础数据里面有不同的区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

感谢关注。谢谢转发分享哦~~


推荐 0
本文由 懒胖子 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册