当我是小必,很高兴在这里遇见你,以Excel和Power BI会友。
本期内容主要讲解Power BI中两个重要的概念,计算列与度量值。在学习Power BI的过程中,这是两个无法规避的概念,也是必学的内容。
计算列不是通过加载数据得到的,而是通过DAX公式创建的。这部分类似于我们在Excel中创建的列。
在Power BI中新建列的可以通过选项卡中的【表工具】-【新建列】来完成。如我们针对下表中的价格与销售数量相乘来计算销售额。那么公式可以写成:
销售额 = [价格]*[销售数量]
计算列与其他的任何列一样,都可以在矩阵和其他的报表中的行、列中来使用。对于表中的其他任何列的计算都只能返回当前行对应的列的数据,无法直接使用其他行的数据。
计算列是始终存在于表中,是用DAX公式创建的真实的物理列,计算列计算时占用的是模型的加载时间而不是查询时间。计算列始终占用的计算的非常宝贵的内存(RAM)。这注定我们在写DAX公式的时候,最优的方案是减少计算列的使用。
当你想对表中的多列进行聚合运算时,那你就应当考虑使用度量值。
度量值同计算列一样,也是通过【新建度量值】的按钮使用DAX公式创建的,虽然度量值要定义在表中,但是度量值并不属于任何表,可以单独存在。
如我们现在使用计算列计算每个商品的毛利率,(即销售额-成本额)/销售额。那么我们先来建立一个计算列的DAX公式:
毛利率 = ([售价]*[销售数量]-[成本价]*[销售数量])/([售价]*[销售数量])
将上面的结果放表表中。来看一下结果:
我们发现上面的每一行都是正确的,但是总计行是错误的。上述表中计算的单个列的每行的总计,我们要计算的是和的比率,不是比率的和。那么此时就需要使用度量了。
下面我们先建立3个计算列:
成本额 = [成本价] * [销售数量]
销售额 = [售价] * [销售数量]
毛利 = 销售额 - 成本额
紧接着建立一个度量值,将度量值放入到表中得到了正确的结果(当然还有其他更加简洁的方法,此处我们只做例子来说明,当然成本价与售价两列的总计可以调整成平均值,或者不显示):
毛利率 = sum([毛利]) / sum([销售额])
从上面的这个例子我们可以看出,计算列与度量都是使用DAX公式,但是他不同的是所使用的计值上下文是不一样的。计算列只能依据所在表的当前行的环境来计算值,但是度量值是一个值,只有受到外部的筛选(如表和矩阵的行、列、筛选器或者其他的视觉对象等)的时候,会计算相应的值。
那么计算列与度量值到底有什么区别:
计算列是在模型刷新时计算,是以所在表的当前的行作为计算环境(也叫行上下文),对表操作时是不会影响计算列的结果的;度量值是在当前的计算环境中进行聚合,受到外部筛选环境(筛选上下文)的影响。
在Excel中度量值通常是度量值的名称后跟(:=)来定义,而在Power BI中,度量值与计算列时都可以直接以(=)来定义,当然度量值也可以使用(:=)来定义,但是Power BI会自动删除":"。
既然计算列与度量值有区别,但是有一定的情况下,对于同一结果都能使用的时候,应该选择那一个,这个由是需求来决定的:
每当你想执行以下操作时,都必须定义一个计算列:
将计算结果放在切片器中,或者在矩阵或透视表 (与量值区域相对) 中的行或列中查看结果,或者在 DAX 查询中使用计算列作为筛选条件。
严格绑定到当前行的表达式。例如,价格 * 数量 无法对这两列求和或求平均。
对文本或数字进行分类。例如,度量值的值范围、客户年龄的范围,如 0-18、18- 25 等。这些类别通常用作筛选器或对值进行切片和分组。
但是,每当你想要显示可以反映用户选择的计算值,并且这些值需要在报表中显示为聚合值时,必须定义度量值,例如:
计算选择报表的利润百分比
计算产品相对所有产品的比率,但按年份和地区筛选
需要注意的是:如果两种方法都可以使用的话,那么优先使用度量值。
当然,计算列与度量值并不是相互割裂的,我们也可以在计算列中使用度量值,这时,我们就需要了解一种叫"转换上下文"的概念了。同时关于上下文的概念,我们会在后面的文章给出相关的解释。参考资料:《DAX权威指南》