• 数据可视化之DAX篇(十五)Power BI按表筛选的思路


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

    ​数据分析就是筛选、分组、聚合的过程,关于筛选,可以按一个维度来筛选,也可以按多个维度筛选,还有种常见的方式是,利用几个特定的维度值构成的表,作为条件表来筛选原始表。

    也就是说,根据一个表,来筛选另外一个表,在PowerBI中怎么做,更具体一点,如何用DAX来完成呢?

    假设原始数据记录为一张模拟的订单表:

     

     

    还有一张表,命名为筛选条件表,

     

     

    根据这个筛选表,来找出订单表中的记录,即找出1月2日产品A和B、以及1月3日产品B的销售记录。

     

    这个问题相当于求两个表的交集,很自然的会想到用表函数

    NATURALINNERJOIN来实现,直接用这个函数来新建表测试一下,

     

     

    你会发现没法正常返回结果,错误提示也很清楚,没有公共联接列。

    所以第一步应该先让两个表产生关系,但是两个表之间只能有一个维度的关系,无法同时在两个列上建立关系,那筛选条件是两个维度怎么做呢?

    很简单,通过两个维度表建立关系就行了,

     

     

    然后再用NATURALINNERJOIN就可以正常提取出需要的数据了,

     

     

    如果觉得前两列是重复的,可以用SELECTCOLUMNS函数来选择结果表中需要的列。


     

    就这个问题继续探索一下,如果筛选条件表和订单表没有建立关系,是否可以实现呢?

    也是可以的,在DAX中还有个强大的函数,TREATAS,专门处理没有建立关系的情况,因为它可以在表之间构建虚拟关系,直接进行筛选。

    可以将上面构建的数据模型中的关系全部删掉,在没有任何关系,也没有维度表,只有筛选条件表和订单表的情况下,使用TREATAS效果如下:

     

    直接得出想要的结果,是不是很强大。

    TREATAS函数在以前的案例中也使用过,但是没有详细介绍,其实它并不难理解。

    DAX函数名称大部分都是用英文单词组合的,TREATAS,是个关系函数,可以理解为TREAT+AS:将xx视同为xx的意思。(具体语法请参考官方文档)

     

    以上面的筛选为例,

     

    --------TREATAS( '筛选条件表', '订单表'[订单日期], '订单表'[产品名称])--------

     

    它就是将“筛选条件表”,视同为订单表中的订单日期列和产品名称列,用订单表中的两列来筛选订单表,当然是能返回正确的结果的。

    TREATAS很好用,它可以在不破坏原有数据模型的前提下,根据现实的需要,在公式内部灵活的构建虚拟关系,来进行计算。

    但它的灵活性也是有代价的,在虚拟关系下运行的速度比实体关系下要慢很多,当数据量较大时会明显的感觉到。

     

    总结

     

    本文通过一个常见的分析场景,给出两个解决办法,并通过这两种办法,认识了两种关系:实体关系和虚拟关系,虚拟关系的筛选是通过TREATAS函数实现的。

    不要因为TREATAS可以不建立关系就能实现筛选,你就忽视建模的作用,在数据模型中建立实体关系总是很必要的。上面第一种方式是DAX数据分析的基本功,在此之上,学习更灵活的技巧,不经意间秀一下,更能让人刮目相看。

  • 相关阅读:
    商户编号前三位代码对应的收单机构大全
    使用邮件模板(freemarker.jar)发送邮件
    Struts2自定义拦截器
    如何在jsp页面显示存储在数据库的图片
    正则表达式 大于0的数字(包含小数)
    Linux的关机命令
    maven的下载和安装
    web.py的安装
    安装第三方插件BeautifulSoup
    myeclipse离线安装pydev插件
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/12814411.html
Copyright © 2020-2023  润新知