前段时间工作上面有一个需求,用户想要自己通过切片器来控制坐标轴的维度,那么这遍文章我就主要是要介绍一下如何制作动态的坐标轴。
这次分析的数据是销售的最低价格,分别从周日期、天日期和promotions三个维度进行分析,要实现的效果是,如果选择了WEEK,那坐标轴就是周的名称,展示周的最低销售价格,如果选择了DAY,那坐标轴则是天的维度,展示每天的最低销售价格。(这里面有个划重点的需要,因为需要用交叉表的方式展示,所以表头还有一个promotions名称需要一并展示出来)
第一步:
Axis dimension Table =
VAR TABLE1=SELECTCOLUMNS(ADDCOLUMNS('T_SALES',"Index","Weekly","PromotionEN",T_SALES[PROMOTION]),"Index","Weekly","Promotion",'T_SALES'[PROMOTION],"Index detail",T_SALES[WEEKLY])
VAR TABLE2=SELECTCOLUMNS(ADDCOLUMNS('T_SALES',"Index","Day","PromotionEN",T_SALES[PROMOTION]),"index","Day","Promotion",'T_SALES'[PROMOTION],"Index detail",'T_SALES'[DATE])
RETURN UNION(TABLE1,TABLE2)
ADDCOLUMNS函数和SELECTCOLUMNS都是表函数,它们的第一个参数是表,返回的也是一张表,这是理解这两个函数的关键。
这个度量值主要是ADDCOLUMNS函数与SELECTCOLUMNS函数的密切配合,先用ADDCOLUMNS函数在提取的维度表上添加一列该维度的属性,返回带属性值的表;然后用SELECTCOLUMNS命名字段名,返回两个相同字段名的表,最后用UNION把两个表合并成一张表。这里面要注意的是promotion这个字段,因为不管是筛选日期还是周的时候,这个指标维度都需要展示出来,所以我们在做Union的时候需要都写出来。
我们创建出来的表效果如下:
第二步:
创建我们需要展示的度量值
MINPRICE =
IF(HASONEFILTER('Axis dimension Table'[Index]),
SWITCH(TRUE(),
SELECTEDVALUE('Axis dimension Table'[Index])="Weekly",CALCULATE([MIN_PRICE],TREATAS(VALUES('Axis dimension Table'[Index detail]),'T_SALES'[WEEKLY]),TREATAS(VALUES('Axis dimension Table'[Promotion]),'T_SALES'[PROMOTION])),
SELECTEDVALUE('Axis dimension Table'[Index])="Day",CALCULATE([MIN_PRICE],TREATAS(VALUES('Axis dimension Table'[Index detail]),T_SALES[DATE]),TREATAS(VALUES('Axis dimension Table'[Promotion]),T_SALES[PROMOTION]))),
error("Single Select"))
最终效果如下
总结:
TREATAS:
1.维度表或事实表之间没有可以单独关联的列;
2.出现多对多或其他无法使用直接的方法关联的情况
3.数据模型非常复杂时,通过建立虚拟关系以减少对表格之间物理连接的依赖
(根据Marco的说法:额外的物理关系可能会在过滤器传播到其他表时产生某种副作用)
将表表达式的结果作为筛选器应用于无关表中的列,表之间不存在关系时,最适合使用。