Power BI学习笔记第05篇:DAX 基础:计算列与度量值

第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 迭代函数

SUMXAVERAGEXCOUNTX 等带 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. 创建度量值的最佳实践

  1. 使用度量值而非计算列:对于聚合计算,优先使用度量值,文件更小、性能更好

  2. 命名规范 :建议使用中文命名,前面加上类别前缀,如:

    • 销售额 - 总计
    • 销售数量 - 月度累计
  3. 使用 DIVIDE 代替除法 :避免除零导致空白或错误

    dax 复制代码
    利润率 = DIVIDE([利润], [销售额])
  4. 善用变量 :使用 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 的高级用法。

相关推荐
哥本哈士奇4 小时前
Power BI学习笔记第06篇:DAX 进阶:时间智能与复杂计算
powerbi
哥本哈士奇21 小时前
Power BI学习笔记第09篇:Power BI Service 发布与共享
powerbi
哥本哈士奇1 天前
Power BI学习笔记第13篇:高级可视化与自定义图表
powerbi
哥本哈士奇1 天前
Power BI学习笔记第14篇:Power Query 高级数据处理
powerbi
哥本哈士奇1 天前
Power BI学习笔记第16篇:Power BI 示例一览
powerbi
哥本哈士奇2 天前
第07篇:可视化图表设计与最佳实践
powerbi
哥本哈士奇2 天前
第08篇:报表交互与筛选器
powerbi
哥本哈士奇2 天前
第10篇:实战案例 — 销售数据分析仪表板
powerbi
哥本哈士奇3 天前
第01篇:Power BI 简介与环境搭建
powerbi