前段时间工作上面有一个需求,用户想要自己通过切片器来控制坐标轴的维度,那么这遍文章我就主要是要介绍一下如何制作动态的坐标轴。

      这次分析的数据是销售的最低价格,分别从周日期、天日期和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的说法:额外的物理关系可能会在过滤器传播到其他表时产生某种副作用)

将表表达式的结果作为筛选器应用于无关表中的列,表之间不存在关系时,最适合使用。

posted on 2020-03-12 15:39  何丸子  阅读(918)  评论(0编辑  收藏  举报