美文网首页数据分析随笔-生活工作点滴
DAX函数应用-统计函数(上)

DAX函数应用-统计函数(上)

作者: 空白嗝子 | 来源:发表于2019-07-23 17:27 被阅读27次

    1.ADDCOLUMNS(<table>, <name>, <expression>[, <name>, <expression>]…)和SELECTCOLUMNS(<table>, <name>, <scalar_expression> [, <name>, <scalar_expression>]…)

    函数作用:ADDCOLUMNS是将计算列添加到给定的表或表的表达式中,SELECTCOLUMNS是将计算列添加到空白表中。

    应用场景:ADDCOLUMNS/SELECTCOLUMNS函数通常与其他函数结合使用,为表新添计算列。

    示例:为原始销售记录表添加一列“AA”,使该列为每种武器的累计销量,并存储为一张新表。

    1.1 ADDCOLUMNS

    原始销售记录表

    新建表:

    ADD = ADDCOLUMNS('销售记录',"AA",CALCULATE(SUM('销售记录'[数量]),ALLEXCEPT('销售记录','销售记录'[武器名称])))

    对'销售记录'表进行添加列操作,添加的新列名称为“AA”,该列的含义是计算每种武器的总销量,借助ALLEXCEPT清除[武器名称]对结果的影响,否则结果全部相同(为所有武器名称销量相加的值)。

    ADDCOLUMNS函数新建表结果

    ADDCOLUMNS函数可以实现目标效果,但是并不需要这么多列,反而容易影响判断,那么还可以这样操作:

    新建度量值:

    总销量 = SUM('销售记录'[数量])

    新建表:

    各武器销量 = ADDCOLUMNS(ALL('销售记录'[武器名称]),"AA",[总销量])

    计算结果:

    ADDCOLUMNS函数计算结果

    当然,也可以使用SELECTCOLUMNS函数实现上述效果。

    1.2 SELECTCOLUMNS

    由于SELECTCOLUMNS函数是在一张空白表上添加列,因此,无需添加原始销售记录表的所有列,假如现在想了解每种武器的总体销量情况,通过下述操作即可实现。

    新建表:

    SELECT = DISTINCT(SELECTCOLUMNS('销售记录',"武器名称",'销售记录'[武器名称],"AA",CALCULATE(SUM('销售记录'[数量]),ALLEXCEPT('销售记录','销售记录'[武器名称]))))

    先看内层,与ADDCOLUMNS函数类似,SELECTCOLUMNS函数也许借助ALLEXCEPT函数分别对各种武器求和,不同的是,SELECTCOLUMN函数要将所需的列挑选出来。

    由于现在只有两列,缺少了订单编号、下单日期等的限制,计算结果会有许多重复项,因此还需DISTINCT函数来删除重复项,可得到以下计算结果:

    SELECTCOLUMS函数计算结果

    2.AVERAGE(<column>),AVERAGEA(<column>),AVERAGEX(<table>,<expression>)

    当我们遇见以X结尾的函数时,应该意识到它一般来说是一个迭代器函数,而去掉X的函数,一般就是它对应的聚合函数,比如SUM()和SUMX()。迭代器函数可以对表中的多个列进行操作,并且可以在这些列中完成逐行求值,而其对应的聚合函数,只能在单个列上运行,并且不知道列中的各个行(没有逐行求值)。

    仅凭文字或许难以理解,以下我将详细介绍二者的区别。

    函数作用:计算平均值(算术平均值)。

    三者差别:

    AVERAGE函数与AVERAGEA函数类似,返回列中值的平均值,区别只在于,AVERAGE函数只能处理数值,而AVERAGEA函数既可以处理数值,又可以处理文本。

    AVERAGEA函数处理文本时:

           计算结果为 TRUE 的值作为 1 计数;

           计算结果为 FALSE 的值作为 0(零)计数;

           包含非数字文本的值作为 0(零)计数;

           空文本 ("") 作为 0(零)计数。

    AVERAGE函数和AVERAGEX就是一对聚合函数和迭代器函数,区别在于AVERAGEX具有对行的感知能力,一行一行地应用所有过滤器后完成求值。

    示例:多种武器在多个销售城市的销售数据如下,现欲计算各个城市的所有武器的销售金额的平均值。

    原始数据

    新建度量值:

    销售金额 = SUM('销售记录'[金额])

    AVERAGEX = AVERAGEX(VALUES( '销售记录' [销售城市]),[销售金额])

    VALUES('销售记录'[销售城市])相当于取出原始数据表中的所有销售城市,自成一张表,并对该表中的每一行进行求均值操作。

    我们再新建一个度量值:

    AVERAGE = AVERAGE([金额])

    不知你是否已经猜想到了它们的结果分别是什么。

    结果如下:

    结果对比

    对于AVERAGEX函数,费城/洛杉矶/纽约/芝加哥的均值为各自的销售金额除以1,而总计行的均值为总销售金额546/销售城市总数量4=136.5.

    对于AVERAGE函数,无法逐行求值,它所能做的就是在应用过滤器之后将所有内容添加到它所呈现的单列中。以费城为例,费城就是它的过滤器,先筛选出费城的总销售金额156,然后除以费城占据的行数7行,结果为22.29。

    很显然,该场景下,我们应该使用AVERAGEX函数。

    补充:实现上述功能,采取AVERAGEX函数的确是最简单最方便的方法,但是之前介绍过的筛选器函数SELECTEDVALUE、HASONEVALUE、HASONEFILTER也是解决此问题的办法之一,不妨一试。

    新建度量值:

    SELECTEDVALUE = IF(SELECTEDVALUE( '销售记录' [销售城市])=BLANK(),DIVIDE([销售金额],DISTINCTCOUNT([销售城市])),[销售金额])

    HANSONEVALUE0 = IF(HASONEVALUE('销售记录'[销售城市]),[销售金额],DIVIDE([销售金额],DISTINCTCOUNT([销售城市]))) 

    HANSONEFILTER = IF(HASONEFILTER('销售记录'[销售城市]),[销售金额],DIVIDE([销售金额],DISTINCTCOUNT([销售城市])))

    以上三种方式都可以得到正确的计算结果。

    计算结果

    相关文章

      网友评论

        本文标题:DAX函数应用-统计函数(上)

        本文链接:https://www.haomeiwen.com/subject/evenhctx.html