• 数据可视化之DAX篇(十九)值得你深入了解的函数:SUMMARIZE


    https://zhuanlan.zhihu.com/p/66424209

    SUMMARIZE函数非常强大,掌握以后表面上看也非常好用,所以我专门写篇文章介绍一下这个函数,至于是否一定要使用该函数,请看完再决定。

     


     

    SUMMARIZE,单纯从英文语义上看,是汇总、总结的意思,而它的功能,确实也就是汇总,它可以返回一个汇总表。

    你可以从官方的文档中查询到该函数的说明,

    它的参数非常复杂和难以理解,参数很多,并且有些参数都是可选的、可重复的。直接靠文档不容易理解,我们可以根据实例来理解它的用法。

    它的参数很多是可选的,让我们按参数由少到多逐步看看它的功能。

    01 | 提取不重复值

    以下表达式,会提取不重复的产品名称:

    维度表1 = SUMMARIZE('订单','订单'[产品名称])

     

     

    SUMMARIZE函数的第一个参数是表,第二个参数是列时,会返回该列的不重复列表,其功能与VALUES相似。

    不过SUMMARIZE函数还可以继续添加第三个、第四个参数列…,看以下表达式的返回结果,

    维度表2 = SUMMARIZE('订单','订单'[产品名称],'日期表'[年度])

     

     

    SUMMARIZE参数表后面跟多个列时,它会返回这些列的有效组合,类似于笛卡尔积,与笛卡尔积稍微不同的是,如果在订单表中不存在这个组合,则返回的列表中,就不会出现这一行。

    举个例子,假如2016年如果没有卖过智能手表,则上述的表达式不会有2016 智能手表这一行。

    02 | 返回汇总表

     

    在上述表达式的基础上,我们继续添加参数如下:

    汇总表1 =
    SUMMARIZE(
    '订单',
    '日期表'[年度],
    '订单'[产品名称],
    "销售额合计",SUM('订单'[销售额])
    )

     

     

    SUMMARIZE参数后面带上列名和表达式时,它会自动计算并返回分组的汇总表,这才是该函数的本质功能,也切合它的字面意义。

    这个功能非常好用,也是我们使用它最普遍的地方。

     

    03 | 返回带合计的汇总表

     

    这是SUMMARIZE的高级功能,在上面的表达式中的分组列外面套一层ROLLUP,看看是什么效果?

    汇总表2 =
    SUMMARIZE(
    '订单',
    ROLLUP('日期表'[年度],'订单'[产品名称]),
    "销售额合计",SUM('订单'[销售额])
    )

     

     

    看到在汇总表的下面还多了几行合计数,这就是ROLLUP参数的作用。它只在SUMMARIZE内部使用,用于为子类别计算小计和总计。

    SUMMARIZE内部还可以使用一个参数是ROLLUPGROUP,使用ROLLUPGROUP代替上面表达式中的ROLLUP,可以返回相同的结果。

    不过如果在上面表达式ROLLUP里面再套一层ROLLUPGROUP,

    汇总表3 =
    SUMMARIZE(
    '订单',
    ROLLUP(ROLLUPGROUP('日期表'[年度],'订单'[产品名称])),
    "销售额合计",SUM('订单'[销售额])
    )

     

     

    分组的小计不见了,只返回了总计, ROLLUP和ROLLUPGROUP组合可以避免出现小计,而只返回总计。这样使汇总表看起来更像是Excel中的透视表。

    关于ROLLUP和ROLLUPGROUP参数,其实它们的合计功能并不常用,但是却导致很多人觉得SUMMARIZE很复杂,你如果也是这种感觉,完全可以不用深究这两个参数的用法,因为你基本上也不会用到它们。

     


     

    SUMMARIZE最常用的还是上面的第二种功能,让我们回头再来看看这种用法,返回一个汇总表确实非常实用,但是这是最优的写法吗?

    使用ADDCOLUMNS返回汇总表

     

    02示例中的表达式,还可以用以下表达式代替,

    汇总表4 =
    ADDCOLUMNS(
    SUMMARIZE(
    '订单',
    ‘日期表'[年度],
    '订单'[产品名称]
    ),
    "销售额合计",CALCULATE(SUM('订单'[销售额]))
    )

     

    即通过ADDCOLUMNS函数,在SUMMARIZE生成分组的基础上添加列,来计算销售额汇总,可以返回相同的结果,但是在性能上,要比单纯的使用SUMMARIZE更优。

    SUMMARIZE函数由于性能和内部兼容性等方面的原因,并不建议使用它来进行汇总,可以使用上面的ADDCOLUMNS和SUMMARIZE组合来代替,另外还有个新函数性能更优:SUMMARIZECOLUMNS。

     

    使用SUMMARIZECOLUMNS返回汇总表

     

    依然是生成上面的汇总表,SUMMARIZECOLUMNS的写法:

    汇总表5 =
    SUMMARIZECOLUMNS(
    '日期表'[年度],
    '订单'[产品名称],
    "销售额合计",CALCULATE(SUM('订单'[销售额]))
    )

     

    是不是看起来更加简洁,它的第一个参数不再需要表,而是直接是分组列,实践上看,它的性能要优于ADDCOLUMNS和SUMMARIZE组合,当然也远优于SUMMARIZE,生成汇总表时建议直接用SUMMARIZECOLUMNS(关于性能,你可以使用DAX Studio进行测试)。

    SUMMARIZECOLUMNS应该就是为了替代SUMMARIZE而出现的,它可以实现SUMMARIZE的功能;SUMMARIZE的内部参数,比如ROLLUPGROUP等,SUMMARIZECOLUMNS同样也有,并且还有更多其他内部参数可以调用,不过对于普通DAX使用者来说,可能并不会使用到,就不再介绍了,想深入理解的请自行查阅该函数文档。

    总结

      • 提取多列的有效组合时,可以使用SUMMARIZE
      • 返回汇总表时,推荐使用SUMMARIZECOLUMNS
  • 相关阅读:
    无法卸载Visual Studio 2005,提示:"H:\vs\vs_setup.msi could not be opened"
    在两个DB的table之间同步数据
    用于标记系统是否需要重启动的注册表键值
    提高性能——存储过程最佳实践 [译自MSDN]
    几个常见的位运算问题
    [存档] 非递归后根遍历二叉树
    [存档] 用真值表设计非递归二叉树遍历算法
    补码
    卸载Google Chrome导致Outlook, Word不能打开超链接
    编程题: 将一个矩阵(二维数组)顺时针旋转90度
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/12814422.html
Copyright © 2020-2023  润新知