DAX基础5: 新建Calculate Column还是Measure?

浏览: 2136

最开始接触DAX的时候,对于该新建Calculate Column还是建立Measure,相信有的朋友一定会感到困惑的。至于在Power BI Desktop中选择建立Calculate Column还是Measure,大概开始的时候都是先试试Calculate Column行不行,不行就Measure上,要么就是一拍脑袋凭第六感。

什么叫做计算字段Calculate Column,什么叫做度量值Measure呢?为什么在报表中建立的是Calculate Column而不是Measure呢?先简单的说下Calculate Column和Measure的区别。Measure的计算占用的是CPU,Calculate Column的计算占用的是内存。这个区别最直观的印象就是,如果你新建的是Calculate Column,那你可以在‘Data’标签页看到这个字段在表中的数据显示。而如果你新建的是Measure,你在‘Data’标签页的数据表中是看不到个字段的。

例如,我随便建立了两个Sales Amount。

Sales Amount = Sales[Unit Price] * Sales[Quantity]

SalesAmount = SUMX(Sales, Sales[Unit Price] * Sales[Quantity])

显示在‘Data’标签页如下:


除了直观上的可见和不可见之外,你肯定也看到了两个定义的表达式也是不同的。这是因为,Calculate Column用DAX做计算总是基于current row(当前行)。Measure用DAX做计算不是row by row(一行一行的),而是aggregate(聚合)。这个也进一步解释了,Calculate Column可以在建他的表中可见,但是Measure不可以在建他的表中可见。不明白?因为Measure是聚合值不是一行一行的计算, 所以在基于行的数据里看不到他。

就刚刚那个例子来说,结果是一样的。截止到只是显示在table来说,随便你建哪个结果都可以。

但是一般来说,如果是Calculate Column一般用在建立Slicer(切片),筛选(filter)这些描述性字段,而Measure就是建立聚合的数据值。换句话说,就是Measure这个度量值,他不能成为Slicer,filter。从Evaluation context来说,在你显示的数据表里,想到filter context,就大概想到Calculate Column,想到row context,就想想Measure。这个没有什么难的,反复默念一句话:Measure度量值没有当前行的概念。

很多时候,Measure能写的计算,基本上Calculate Column基本也能写。不过,他们还是有些区别的。Calculate Column虽然说也可以在一定范围内进行计算,但是在一个表里面,他是先进行计算,然后作为一个属性存在的。是一个filter Context的存在。举个例子。

DAX分享1里面Margin的计算如下:

Margin = DIVIDE(

                CALCULATE(

                    SUM('Product'[Unit Cost]),

                        ALLEXCEPT(

                            'Product',

                            'Product'[Color]

                        )

                 ),

                CALCULATE(

                    SUM('Product'[Unit Price]),ALLEXCEPT('Product','Product'[Color])

                 ),0 )

(数据准备和需求思路什么的,可以自己参考DAX分享1,在此不多说了。)

在计算这个Margin,其实这个DAX表达式写在Calculate Column和写在Measure里面都可以。因为我在DAX分享1里面只是用作后面计算的filter而且我想直观的在Date标签页的表里观察到每一个color的margin,所以我建立了Calculate Column。但是,如果需要把这个Margin的值显示在报表页面里,其实应该建立measure的。

我随便建了一个同样定义的measure (Margin%),拉一个表显示如下:

几乎是一样的,只是Margin 在Calculate Column的定义里,没有计算Total,但是在measure 的计算里,计算了Total。这是为什么呢?因为Calculate Column是一个属性,Don't summarize(不做聚合计算)。

总结下:如果你考虑的是属性类的,那就建立Calculate Column。什么是属性?就是对一个事物的描述类的内容。比如说,小明有一套房子,‘一套房子’就是小明的一个属性。相应的如果复杂计算,百分比计算什么的就是Measure。他可以根据不同的filter context去显示row Context的结果。Calculate Column可以做filter, Slicer但是Measure 不可以。这也是因为Measure没有行的概念,是一个聚合值。Measure要在确定范围内,才能得到确定值。

刚开始都是概念的东西,不够生动,所以可能觉得有点难懂。我只是想把这两个比较复杂的先说下,有个印象,后面再反复念叨。这个懂不懂不影响你继续学习DAX,尤其是下一期开始说函数,到时候就更简单了。有个大概的印象,有个印象就可以了,是不是很简单啊!

欢迎关注分享DAX Share


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

1 个评论

写的好

要回复文章请先登录注册