PowerBI的聚合与Calculate函数

PowerBI的聚合与Calculate函数

3 年前 · 来自专栏 PowerBI大师

学习DAX的确比 可视化 获取数据 要多花一些气力,不过有了上个章节的对DAX原理的铺垫,第四章的内容可谓 温故而知新。 原理和新公式 相结合 就好像你刚开始学Excel公式 Sum,If,Vlookup... ,掌握其实并不难,一个新公式+一次实践练习就可以解锁一个新技能。当你完成整个第四章 24个公式的学习时,你就好比掌握了 太极拳的24个精髓招式 ,组合起来运用自如可 以不变应万变


1 最常用的公式
DAX函数部分是与Excel函数是相通的,对于基本的 时间日期、信息、逻辑、数学、统计、和文本函数 用法大致相同,这部分基础类函数我假设大家有一定的认识,百度也能够搜到Excel公式海量的解释和案例,你可以按需补充,现学现卖,在这里不多讲。


我想把时间专注在DAX的核心类系, 聚合、筛选、时间智能、关系、迭代等等 ,为了更好地把这些技术一个个解锁,我选取了 24个最常用的函数 ,并把这些函数的学习细分成了3个阶段。 第一阶 是最常用最核心的部分,攻克了它便可以胜任一些小的数据分析模型; 第二阶 较为容易,与Excel的函数很像,可以说是 Excel版的扩展 第三阶 相对前两个阶段来讲属于高阶函数,然而我们有了前两阶的学习基础,它不过是另一个小山头。掌握了这24个公式,我相信它们至少可以覆盖到 80%的数据分析需求 ,对于另外的20%我们可以现用现查。


2 聚合函数
在度量值 公式栏 里,无论你输入 ' 还是 [ ,智能提示的 都不会是列 ,而是其他已创建好的度量值,所以 度量值是不可以直接引用列 的。比方 '咖啡数据表' 中的 [数量 ]列, 该表有近3万行,把这3万行的数据放入度量值中是没有任何意义的。 度量值 输出的是 一个计算结果 ,所以我们只有用聚合函数求计算列的聚合值才有效。


聚合函数与Excel的基本计算函数是非常相像的,区别是Excel引用的是单元格,而DAX引用的是列。我们 仍在咖啡数据表 的基础上来完成:
<公式1> 求咖啡卖的杯数 [销售量]=Sum('咖啡数据'[数量])
<公式2> 求[ 平均杯数]=Average('咖啡数据'[数量]) ;注意公式栏里的解释也是非常有用的提示。


<公式3> 如果每一行数据视为一位顾客购买的订单,求订单中最大的杯数 [最大杯数]=Max('咖啡数据'[数量]);
<公式4> 求订单的数量 [订单数]=Countrows('咖啡数据') ,这里你发现,聚合函数不仅可以 引用列 还可以 引用表 ,Countrows即计算表或列的行数。
<公式5> 求我们在全国有多少个城市分店 [城市数量]=distinctcount('咖啡数据'[城市]) , Distinctcount是计算 列中不重复值的数量
上面5个函数的计算结果如下表。同理,计算最小值用Min,计算空白项个数Countblank,还有Count,CountA(计算列中不为空的数目)等等。这些道理是一模一样,大家自行挖掘,也可以随用随查。


3 Calculate 最强大的函数
从Calculate的语法结构我们可以看出它能够把计算表达式和筛选条件整合起来。我们前面把 度量值比作带着漏斗的计算器, 那么 <公式6> Calculate就是漏斗与计算器之间的启动键, 它能够赋予漏斗按指定的条件来执行过滤筛选,同时让计算器执行运算。



我们按上面制作一个矩阵表,行为'原材料'[咖啡种类],列为'杯型'[体积],值为[销售量]。现在我们再做一个 试验 ,再创建一个 [销售量2]=Calculate([销售量], '原材料'[咖啡种类]="拿铁", '杯型'[体积]="480ml") ,把矩阵表中的值替换为[销售量2]。你会得到下面这个表,是不是有些惊讶!难道是出Bug了?所有的值都为在 拿铁咖啡 杯型体积=480ml 限定条件下的销售量。

这个输出的结果是 完全没有问题的 ,我们做这个例子是为了说明Calculate工作原理,从这个结果中可以得出一点关于Calculate函数重要的结论 ,Calculate可对初始筛选增删改 ,即生成新的筛选上下文


可以说掌握了Calculate就好比掌握了 自定义 功能,比方说标准的拿铁咖啡是由浓缩、牛奶、奶泡按一定比例构成,现在你可以自定义修改配方,加入香草和焦糖变成香草焦糖拿铁。

Calculate可以应用在多个表 。注意到[销售量2]公式引用的是 '原材料 ' 和' 杯型'表 ,两个都是 Lookup表 。按照我们在3.2《表与表关系》的原理,启动Calculate仿佛是开启了漏斗过滤器的一个 阀门 ,使数据像水一样顺流而下,执行对数据表的筛选。

筛选条件拿铁和体积=480ml两者同时满足,是AND关系。 在DAX中,如果想表达 的关系,运算符为“ || ”。但是在本例中如果直接写=Calculate([销售量], '原材料'[咖啡种类]="拿铁"||'杯型'[体积]="480ml" ) 这个是无效的。记住在Calculate中使用||时,必须是引用同一列, 比方 =Calculate([销售量], '杯型'[体积]="360ml"||'杯型'[体积]="480ml" ) 这个是可以的。

有人称Calculate为超级版Sumif,但它的能力远比Excel中的Sumif强大多了。我们这个例子用的销售量是Sum求和,然而Calculate可以与各种聚合函数 搭配组合 Average, Count, Max...可以说是没有限制。要知道Excel中是没有Maxif/Minif这种公式的。

Calculate的强大还不止于此,它可以与各种筛选器函数搭配组合如All,Values,Filter来发挥更强大的功能,后面的几节我们分别介绍。

PowerBI教程之PowerPivot建模和DAX - 网易云课堂

____________________________________

编辑于 2020-04-02 22:35

文章被以下专栏收录

    PowerBI大师

    PowerBI大师

    从Excel到PowerBI,从数据到故事的进化