正在准备一个全新内容,从而验证喜乐君分析框架的普适性。全新视角看DAX:课程 博客同步要点:
- DAX Guide-1-分析的本质与Measure
- Dax Guide-2-为分析而“准备”与Column 2023/9
- DAX Guide-3-“百变”筛选FILTER与计算优先级 2023/9 V1
希望进一步了解,欢迎观看系列视频:
【B 站课堂】DAX 别裁新解 https://www.bilibili.com/cheese/play/ss8780?bsource=link_copy
该视频系列在2024年7月第三遍录制,增加了SQL 对比,增加了诠释深度
最新版本介绍视频 (在线播放)202407 V3
一、分析计算的两个阶段
为什么 DAX 难以理解?一个关键原文是,它严格区分了两个计算阶段,甚至为此设置了两个入口、两个标识符,这是为了兼容数据计算和可视化渲染两个更宏大的阶段,但无形中让简单的问题也变得复杂。
相比之下,SQL是编程语言,它天然有优先级概念,所以在select查询中,可以同时出现year函数和sum函数。
实例:各年度的销售数量总和

但是在DAX中,类似的逻辑就会出错。为此,我们必须明确地区分何为“问题阶段”的计算,何为预先在数据表明细行的计算——或者说,哪些是关于聚合的,哪些是为聚合而做的准备。

在DAX中,于是就有了Calculated Column的概念,以新功能的方式,强制指定它的计算必须相当于明细表而有意义,在它之后,才能完成问题阶段的分组聚合。正因为此,calculated Column的计算结果,可以在问题中承担任意角色——不管是筛选、分组字段,还是作为聚合对象。
二、DAX的计算列语法
也就是说,DAX的Calculated Column,以及为此单独设计的入口,强调了优先级的先后次序,弥补了函数语言先天性不足。
如下所示,可以先定义一个计算列,它会先于summarizecolumn而计算。

如果把上面的Column改完VAR变量,可以吗? 如下所示,运行会出错。大家可以评论一下为什么。

三、如何区分“预先计算”与“临时计算”
怎样的计算是在明细表中预先完成的,怎样是在视图中按需完成?
这是通往计算优先级的关键之一。
如果定义一个计算列,那么就会在内存引擎中预先完成,以备视图聚合需要(哪怕最后没有用到);而度量值中的“临时计算列”,则可以在聚合过程中临时完成。
喜乐君 V0.1