第05篇:DAX 基础:计算列与度量值
1. DAX 是什么
DAX(Data Analysis Expressions)是 Power BI 内置的数据分析表达式语言,类似于 Excel 公式但远比 Excel 强大。它用于创建计算列、度量值和自定义表。
简单理解:DAX 就是 Power BI 中的"公式",让你在数据模型上进行各种复杂的计算和分析。
2. 计算列 vs 度量值
这是 DAX 中最核心的概念,必须彻底理解两者的区别。
| 特性 | 计算列 | 度量值 |
|---|---|---|
| 计算时机 | 数据刷新时(静态) | 报表查询时(动态) |
| 存储位置 | 存储在数据模型中 | 不存储,运行时计算 |
| 计算上下文 | 当前行上下文 | 筛选上下文 |
| 对文件大小的影响 | 增加文件体积 | 不增加文件体积 |
| 适用场景 | 需要按行筛选的基础字段 | 聚合计算、比率计算 |
2.1 计算列示例
创建一个"利润率"计算列:
利润率 = (销售表[销售额] - 销售表[成本]) / 销售表[销售额]
计算列会在每行数据中存储结果,适合用作筛选条件或需要固定值的场景。
2.2 度量值示例
创建一个"总销售额"度量值:
总销售额 = SUM(销售表[销售额])
度量值在报表中被引用时才会计算,会根据用户选择的筛选条件动态变化。
3. DAX 基础语法
3.1 基本结构
DAX 公式以"列名/度量值名 = 表达式"的形式存在:
dax
度量值名称 = DAX表达式
3.2 常用运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
+ |
加法 | [销售额] + [成本] |
- |
减法 | [销售额] - [成本] |
* |
乘法 | [数量] * [单价] |
/ |
除法 | [利润] / [销售额] |
&& |
逻辑与 | [类别] = "电子产品" && [销售额] > 1000 |
| ` | ` | |
IN |
多值匹配 | [产品] IN {"产品A", "产品B"} |
3.3 常用聚合函数
| 函数 | 说明 | 示例 |
|---|---|---|
SUM |
求和 | SUM(销售[销售额]) |
AVERAGE |
平均值 | AVERAGE(销售[销售额]) |
COUNT |
计数(数字) | COUNT(销售[订单ID]) |
COUNTA |
计数(非空) | COUNTA(销售[备注]) |
COUNTROWS |
计行数 | COUNTROWS(销售) |
MAX |
最大值 | MAX(销售[销售额]) |
MIN |
最小值 | MIN(销售[销售日期]) |
DISTINCTCOUNT |
去重计数 | DISTINCTCOUNT(销售[客户ID]) |
4. 筛选函数
4.1 CALCULATE(DAX 最强大的函数)
CALCULATE 是 DAX 中最核心、最重要的函数,用于在指定筛选条件下计算表达式。
语法:
dax
CALCULATE(<表达式>, <筛选器1>, <筛选器2>, ...)
示例:计算电子产品类别的总销售额
dax
电子产品销售额 =
CALCULATE(
SUM(销售[销售额]),
销售[产品类别] = "电子产品"
)
示例:计算包含多个条件的销售额
dax
高价值销售 =
CALCULATE(
SUM(销售[销售额]),
销售[销售额] > 5000,
销售[地区] = "北京"
)
4.2 FILTER
FILTER 返回一个按条件过滤后的表,常与 CALCULATE 配合使用。
dax
高端产品销售 =
CALCULATE(
SUM(销售[销售额]),
FILTER(
ALL(产品[产品名称]),
[销售额] > 10000
)
)
4.3 ALL 系列函数
| 函数 | 说明 |
|---|---|
ALL() |
移除所有筛选器,返回完整表/列 |
ALLEXCEPT() |
移除指定列之外的所有筛选器 |
ALLSELECTED() |
移除当前视觉对象的筛选器,保留页面/报表级筛选 |
dax
总销售额(忽略所有筛选) =
CALCULATE(
SUM(销售[销售额]),
ALL()
)
5. 上下文的概念
理解"上下文"是掌握 DAX 的关键。
5.1 行上下文(Row Context)
计算列内部的上下文,指当前行。
dax
利润率 = DIVIDE([销售额] - [成本], [销售额])
在第5行计算时,[销售额] 和 [成本] 取的是第5行的值。
5.2 筛选上下文(Filter Context)
度量值被计算时,报表中所有筛选条件(切片器、视觉对象筛选、页面筛选等)的组合。
把"筛选上下文"理解为:度量值计算时,当前的"分析视角"是什么。
5.3 迭代函数
SUMX、AVERAGEX、COUNTX 等带 X 的函数称为迭代函数,它们会对表中的每一行进行计算,然后汇总结果。
示例:
dax
订单利润 = SUMX(
销售,
销售[销售额] - 销售[成本]
)
等价于为每行计算 销售额 - 成本,然后求和。
6. 常用 DAX 函数分类速查
数学与统计
| 函数 | 说明 |
|---|---|
DIVIDE |
安全除法(避免除零错误) |
ROUND |
四舍五入 |
SUMX |
求和(支持表达式) |
RANKX |
排名 |
逻辑函数
| 函数 | 说明 |
|---|---|
IF |
条件判断 |
SWITCH |
多条件分支 |
AND / OR |
逻辑运算 |
文本函数
| 函数 | 说明 |
|---|---|
CONCATENATE |
拼接文本 |
LEFT / RIGHT |
截取文本 |
UPPER / LOWER |
大小写转换 |
FORMAT |
格式化数字/日期 |
日期函数
| 函数 | 说明 |
|---|---|
YEAR / MONTH / DAY |
提取日期部分 |
DATEDIFF |
计算日期间差 |
FORMAT |
格式化日期 |
7. 创建度量值的最佳实践
-
使用度量值而非计算列:对于聚合计算,优先使用度量值,文件更小、性能更好
-
命名规范 :建议使用中文命名,前面加上类别前缀,如:
销售额 - 总计销售数量 - 月度累计
-
使用 DIVIDE 代替除法 :避免除零导致空白或错误
dax利润率 = DIVIDE([利润], [销售额]) -
善用变量 :使用
VAR提升可读性和性能dax总利润 = VAR TotalRevenue = SUM(销售[销售额]) VAR TotalCost = SUM(销售[成本]) RETURN DIVIDE(TotalRevenue - TotalCost, TotalRevenue)
8. 小结
本篇介绍了:
- ✅ 计算列与度量值的核心区别
- ✅ DAX 基本语法和常用运算符
- ✅ 聚合函数(SUM、AVERAGE、COUNT 等)
- ✅ CALCULATE、FILTER、ALL 等筛选函数
- ✅ 行上下文与筛选上下文的概念
- ✅ 迭代函数(带 X 的函数)
- ✅ DAX 最佳实践与命名规范
个人的一些经验:
- DAX很常用,但有时也有点复杂,不过其门槛并没那么高,毕竟DAX的可读性还是很高的,基本上看公式就能理解其功能。
- 可以借助AI工具对报告的公式进行解读,或者让AI工具直接读报告,根据你的提示词来生成相应的公式。
- 关于常用的DAX,建议参考阅读我另外一篇笔记,它根据一个具体的实例来汇总常用的DAX:https://blog.csdn.net/aspnetx/article/details/159894938?spm=1001.2014.3001.5502
下一篇:我们将深入 DAX 进阶,学习时间智能函数(如同比、环比计算)以及 CALCULATE 的高级用法。