假设我们有产品表
和销售表
我们想实现下面的效果
表格显示每个产品的信息,以及单个产品的总销量
有一个切片器能筛选各个门店的产品销量
还有一个卡片图显示所筛选条件下,所有产品的总销量
实现方法:
1.我们新建一个计算表,把门店信息从销量表里提取出来,这里我不建议直接将数据表的的字段放入切片器,因为它是维度,实际开发中,维度表可能有多个字段,多个表联合组成,所以最好是用单独的表。
门店表 = DISTINCT(SELECTCOLUMNS('销量表', "门店名" ,'销量表'[销售门店]))
2.将产品表和销量表关联起来
3.新建度量值,计算每个产品的销量
这里有两种做法,一种是先将销量表和门店表建立关联,度量值里就不需要显式FILTER了,写法如下:
L1_销量 = SUMX(GROUPBY(
'销量表',
'销量表'[产品编码],
"SUM", SUMX(CURRENTGROUP(), '销量表'[销售量])
), [SUM])
另外一种方法,是数据表和维度表因为某些原因,无法建立显式的关系,我们就需要在度量值里做筛选,写法如下:
L1_销量 = SUMX(GROUPBY(
FILTER('销量表', IF(ISFILTERED('门店表'[门店名]), '销量表'[销售门店] IN VALUES('门店表'[门店名]), TRUE())),
'销量表'[产品编码],
"SUM", SUMX(CURRENTGROUP(), '销量表'[销售量])
), [SUM])
解释:按照产品编码分组,计算每个产品编码的总销量(GROUPBY),然后再求总和(最外层的SUMX)。看到这,有小伙伴可能会问:表格里的销量不是按照每行的产品销量吗?你这里为什么求总和?不着急,后面会讲。
注意:
1. ISFILTERED,用于判断切片器是否有选择筛选。如果有多个就 && IF(ISFILTERED...) && IF(ISFILTERED...) 。因为只要某一个不筛选,就会返回TRUE(),TRUE不会改变其他的筛选条件。
2. IN VALUES,是用于切片器是多选的情况,如果是单选用SELECTEDVALUE()。
还需要注意一点的是,如果切片器显示的字段,和FILTER里需要筛选的字段不同,比如这里筛选的是门店编码而不是名称:
IN VALUES( '门店表'[门店编码])
只要切片器用的字段和FILTER里的字段,都来自同一张表,或者是已经建立了关系的多张表,都是可以筛选的,不需要担心字段不同。
设置千分位
4.新建表格,拖入字段:
在"列", 双击列名就可以修改名字
效果如下:
5.新建一个卡片图,把度量值 [L1_销量] 放入卡片。修改标注的方法,是直接在字段那里修改
效果:
度量值 [L1_销量],放入表格里,会自动根据关联关系逐行计算,每次只计算当前行的产品销量,放在表格外,就会计算所有的总和。
6.选择切片器进行筛选显示,完成: