如何对矩阵中的所有值进行比较?
(一) 分析需求
需求相对比较明确,就是在矩阵中显示的值,需要进行整体比较,而不是单个字段值直接进行的比较。如图1所示,确认矩阵中最大值或者最小值。
(二) 实现需求
要实现这一步需要分析在矩阵或者透视表的情况下,如何对整体数据进行比对,实际上也就是忽略矩阵的所有维度进行比对。上面这个矩阵的维度有品牌Brand以及洲Continent。只需要在计算比较值的时候对维度进行忽略即可。如果所有字段在单一的表格中,那相对比较好办,只需要在计算金额的时候忽略表中的维度即可。
如果维度在不同表中,那建议构建一个有维度组成的表并进行计算。可以通过summarize构建维度表并使用addcolumns增加计算的值列,达到同样的效果。之后就比较简单了,直接忽略维度计算最大值和最小值再和当前值进行比较。通过这个值的大小设置条件格式,就能在矩阵中显示最大值和最小值的标记了。
代码语言:javascript复制VAR MinValue = MinX('构建表','构建表'[@SalesAmt])VAR MaxValue = MaxX('构建表','构建表'[@SalesAmt])VAR CurrentValue = [Sales Amount]VAR Result = SWITCH ( TRUE, CurrentValue = MinValue, 1, CurrentValue = MaxValue, 2 )RETURN Result
当然只需要进行计算的话,这个表可以书写在内存变量里面,通过var进行赋值,在后面的计算过程中进行调用。
代码语言:javascript复制var t=CALCULATETABLE( ADDCOLUMNS( SUMMARIZE('Sales','Product'[Brand],Store[Continent]), "@SalesAmt", [Sales Amount] ), all('Product'[Brand]),all(Store[Continent]))VAR MinValue = MINX(t,[@SalesAmt])VAR MaxValue = MaxX(t,[@SalesAmt])VAR CurrentValue = [Sales Amount]VAR Result = SWITCH ( TRUE, CurrentValue = MinValue, 1, CurrentValue = MaxValue, 2 )RETURN Result
注意:在计算最大值和最小值的时候,如果未使用真实表的话,则需要添加all来进行忽略维度进行计算,如果是实际表则可以直接求最大和最小值。
当然这里还会有一个问题,和之前的文章中类似,如果同时具备这两个维度的外部筛选条件,那这样做的话也会出错,如图3所示,因为筛选后把最大值或者最小值给筛选掉了,因为我们要显示的是矩阵中的值进行比较,如果通过外部筛选后,矩阵中的值会变化,所以这时使用AllSelect会更合适。
把忽略的2个维度使用AllSelect()来进行替换即可,最后得到符合需求的样式。条件格式可以直接在设置表里根据判断条件1或者2来进行设置,如图4所示。
最终显示的才是正确的结果,如图5所示。