上一篇文章中的分组,都是通过新建列的方式实现的,直观上比较容易理解。不过这样都修改了原始数据的结构,如果我们不在源表上进行修改,直接通过度量值的方式来进行分组,是否可以实现呢?
答案当然是肯定的。
采用度量值的方式首先定义好分组的类别和标准,然后把需要分组的数据分别统计到指定的分组中。
依然按照上篇文章的数据,统计优秀、良好、及格和不及格的学生分别有多少?
成绩表中的数据结构不做任何更改,我们先创建一个分组表,
如果成绩落在最小值和最大值之间,就归属于该分组。
编写度量值如下:
成绩分组统计 =
CALCULATE(
DISTINCTCOUNT('成绩'[姓名]),
FILTER('成绩',
AND(
'成绩'[数学成绩]<=SELECTEDVALUE('分组表'[最大值]),
'成绩'[数学成绩]>=SELECTEDVALUE('分组表'[最小值])
)
)
)
使用度量值和新建列的不同之处就是,新建列的行上下文是确定的,可以直接使用行字段,而度量值的外部上下文是动态的,所以无法直接和某个具体指标匹配,这时就要用到SELECTEDVALUE函数,它根据外部上下文的环境来进行动态匹配运算。
编写度量值的表达式时,不知道如何查找外部上下文时,一定不要忘了SELECTEDVALUE函数。
利用矩阵来看看度量值的结果,
这样每个类别的人数就统计出来了,不过有个问题是,总计行没有计算出来。原因是由于SELECTEDVALUE函数函数只查找了分组表中的类别,而该表并没有总计这个值,所以无法计算显示为空。
为了使总计正常显示,可以再加个判断函数ISFILTERED,如果分组列中有该分类,就正常执行上面的度量值计算,否则返回成绩表中人数合计。
更改后的度量值如下:
成绩分组统计 =
IF(ISFILTERED('分组表'[分组]),
CALCULATE(
DISTINCTCOUNT('成绩'[姓名]),
FILTER('成绩',
AND(
'成绩'[数学成绩]<=SELECTEDVALUE('分组表'[最大值]),
'成绩'[数学成绩]>=SELECTEDVALUE('分组表'[最小值])
)
)
),
DISTINCTCOUNT('成绩'[姓名])
)
然后总计行会正常显示。并且源数据发生变化,度量值返回的结果也会同步更新。
以上就是使用度量值进行分组的做法,DAX看起来很长,其实逻辑上比较简单,理解它对进一步掌握DAX有很大帮助。利用度量值,进行数据分析时可以更灵活的使用,下篇文章介绍度量值分组的应用场景。