在Excel 中我们知道条件求和有几个函数,如SUMIF、SUMIFS、SUMPRODUCT等,虽然在Power BI Desktop 中,通过分组或者筛选,可以做到根据分组或者筛选的条件求和,但是在某些场景下,我们还需要创建一些具有条件求和的度量值,本文就针对条件求和,介绍如何利用DAX函数创建条件求和的度量值。
1、数据准备
我们先准备一组销售数据,如下图所示:
将数据导入到Power BI Desktop 中,结果如下图所示:
对于条件求和,我们分解为三个部分讲解:
· 单条件求和
· 多条件求和
· 关联表条件求和
2、单条件求和度量值
我们假设要计算PID值为2的销售额,操作方法如下。
方法一:CALCULATE法
创建一个“单条件CAL”度量值:
单条件CAL = CALCULATE(SUM('ResellerSales_USD'[SalesAmount_USD]),'ResellerSales_USD'[PID]=2)
结果如下图所示:
方法二:SUMX法
创建一个“单条件CAL”度量值:
单条件SUMX = SUMX(FILTER('ResellerSales_USD','ResellerSales_USD'[PID]=2),'ResellerSales_USD'[SalesAmount_USD])
结果如下图所示:
为了对比这两种方法的结果和准确性,我们在报表页上创建一个【多行卡】对象,并将这两个度量值拖拽到这个可视化对象中,效果如下图所示:
从上图我们可以看到,这两种方法计算出来的结果是一致的,但是是否和真实值是一致的呢?我们再通过Excel 进行筛选求和,如下图所示:
从上图的结果,和度量值计算出来的结果,我们对比后发现,这三个值是一致的,也就是说,使用这两种方法就算出来的结果,是准确的。
3、多条件求和度量值
在单条件的基础上,我们在日常分析中,还可能遇到多条件,所谓多条件,就是两个或者两个以上条件,在Excel 中,我们可以使用SUMIFS函数,将若干个条件放一起,作为求和的依据,那么在DAX中如何实现呢?借助刚才单条件求和的方法,这里也为大家介绍两种多条件的DAX度量值写法,以PID为2,日期大于等于2018年5月3日我条件说明一下。
方法一:CALCULATE法
创建一个“多条件CAL”度量值:
多条件CAL = CALCULATE(SUM('ResellerSales_USD'[SalesAmount_USD]),'ResellerSales_USD'[PID]=2,'ResellerSales_USD'[DATE]>=DATE(2018,5,3))
结果如下图所示:
方法二:SUMX法
创建一个“多条件SUMX”度量值:
多条件SUMX = SUMX(FILTER('ResellerSales_USD',AND('ResellerSales_USD'[PID]=2,'ResellerSales_USD'[DATE]>=DATE(2018,5,3))),'ResellerSales_USD'[SalesAmount_USD])
结果如下图所示:
为了验证结果,我们同样将这两个度量值拖拽到刚才创建的多行卡中,对比结果如下图所示:
同上图对比来看,这两个多条件求和的度量值计算的结果是一致的,我们再通过对Excel 源数据进行筛选求和对比,如下图所示:
通过筛选求和对比,和我们使用度量值计算出来的结果也是一致的。
这里要说明的是,在CALCULATE方法中,条件是使用半角逗号间隔,而使用SUMX方法,则使用AND作为条件合并,此外,需要注意的是,AND函数仅仅对于两个条件有效,当超过两个条件时,我们需要使用&&来作为条件的间隔,两个条件的时候同样可以使用这个方法,如多条件求和的SUMX方法我们还可以换成:
多条件SUMX_1 = SUMX(FILTER('ResellerSales_USD','ResellerSales_USD'[PID]=2&&'ResellerSales_USD'[DATE]>=DATE(2018,5,3)),'ResellerSales_USD'[SalesAmount_USD])
结算结果对比效果图如下图所示:
4、跨表条件求和度量值
在以上的分享中,我们介绍了在同一个表的单条件求和和多条件求和的度量值写法,而在Power BI Desktop 中,我们还有一种场景,就是跨表条件求和。
Power BI Desktop 作为全民BI 软件之一,有一个很大的特点就是,数据库思维,原来我们在Excel 中,可能会将所有的数据信息都存放到一个表中,然后通过筛选或者是简单的函数求和,但是在Power BI Desktop 中,我们的思路就不是要做大表,而是拆表成细分表,比如说刚才我们导入的销售表中,其中的PID字段就是品类的字段,它只是品类的代码而已,如果我们要换成品类的名称,就需要借助一个码表,即品类ID对应的品类名称的对照表,如下图所示:
我们将这个码表导入到Power BI Desktop 中,并查看与原先导入销售表的关联关系,默认是自动设置的,如果没有设置,那我们只需要手动拖动相应的字段放到另一个表的字段中就可以,效果如下图所示:
切换到【数据】选项中,我们可以看到PID=2就是品类为Bikes的品类,如下图所示:
换言之,如果我们要求PID=2,也就是说要求品类名称为Bikes的销售额,为了求这个,我们先在原来的销售明细表中创建一个销售额的度量值:
销售额 = SUM(ResellerSales_USD[SalesAmount_USD])
效果如下图所示:
先看看根据之前我们使用的SUMX方法,如何调整度量值,我们先创建一个跨表SUMX 的度量值:
跨表SUMX = SUMX(FILTER('ProductCategory','ProductCategory'[ProductCategoryName]='bikes'),'ResellerSales_USD'[销售额])
效果如下图所示:
需要注意的是,使用这种方法操作,SUMX的第二个参数不能直接引用数据表中的SalesAmount_USD列,否则得到的结果是错误的,有兴趣的朋友可以自己试一下,在这里就不再赘述了。
我们将这个跨表的度量值拖拽到多行卡中,和之前使用SUMX单表计算的结果对比,结果如下图所示:
通过上图的对比结果,我们发现这两个度量值的结果是一致的,也就是说通过关联表的方法,也可以使用跨表条件求和。
我们再试试使用CALCULATE的方法,看看如何做到跨表条件求和。创建一个“跨表CAL”的度量值:
跨表CAL = CALCULATE('ResellerSales_USD'[销售额],'ProductCategory'[ProductCategoryName]='bikes')
将度量值拖拽到多行卡中,对比效果如下图所示:
我们通过两种方法,介绍了三个场景下的条件求和方法,包括单条件、多条件以及跨表求和,通过以上的介绍,大家是否觉得这个和Excel 的SUMIFS函数有点类似呢。