惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
A
About on SuperTechFans
量子位
B
Blog RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园_首页
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
Google DeepMind News
Google DeepMind News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
G
Google Developers Blog
U
Unit 42
D
DataBreaches.Net
博客园 - Franky
D
Docker
宝玉的分享
宝玉的分享
Y
Y Combinator Blog
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Hugging Face - Blog
Hugging Face - Blog

博客园 - 哥本哈士奇(aspnetx)

dbt+SQLServer构建数据仓库(13):运维 FAQ 篇 dbt+SQLServer构建数据仓库(12):进阶 FAQ 篇 dbt+SQLServer构建数据仓库(11):FAQ 篇 dbt+SQLServer构建数据仓库(10):macro 以及 data vault的应用实例 dbt+SQLServer构建数据仓库(9):用Vibe Coding创建一个DBT UI dbt+SQLServer构建数据仓库(8):Vibe Coding用dbt构建data vault数仓 dbt+SQLServer构建数据仓库(7):进阶扩展 dbt+SQLServer构建数据仓库(6):Jinja与DAG实战 dbt+SQLServer构建数据仓库(5):数据测试 dbt+SQLServer构建数据仓库(4):分层建模实战 dbt+SQLServer构建数据仓库(3):dbt_project.yml配置精讲 dbt+SQLServer构建数据仓库(2):与传统方案对比及迁移决策 dbt+SQLServer构建数据仓库(1):认识dbt与项目工作流程 SQL Server 索引知识汇总 医疗器械行业 Salesforce Territory 完整落地实例 Raw Data Vault vs Business Data Vault Neo4j 多跳查询实战:从社交网络场景理解图遍历 Git 本地版本管理学习笔记 看完《低智商犯罪》,学习Cypher构建知识图谱 LangChain DeepAgents 学习笔记 LangChain Deepagent 版本0.6.1中间件一个bug Neo4j笔记(五):查询的处理流程 微软 SQL Server 版本演进史:从诞生到 SQL Server 2025 提升 Text2SQL 准确率 SQLServer Management Studio(SSMS) 22 Copilot 最佳实践学习笔记 SQLServer RAG笔记4:从服务层到前端交互 SQLServer RAG笔记5:为SQLServer 2025配置Ollama SQL Server RAG 笔记3:SQLServer2025 向量数据库 详解传统RAG、Text2SQL、Graph RAG:适用场景与问题示例汇总 SQL Server RAG 笔记2:图数据库服务层与前端可视化构建
Power BI学习笔记第05篇:DAX 基础:计算列与度量值
哥本哈士奇(aspnet · 2026-04-25 · via 博客园 - 哥本哈士奇(aspnetx)

第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表达式

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 中最核心、最重要的函数,用于在指定筛选条件下计算表达式。

语法

CALCULATE(<表达式>, <筛选器1>, <筛选器2>, ...)

示例:计算电子产品类别的总销售额

电子产品销售额 = 
CALCULATE(
    SUM(销售[销售额]),
    销售[产品类别] = "电子产品"
)

示例:计算包含多个条件的销售额

高价值销售 = 
CALCULATE(
    SUM(销售[销售额]),
    销售[销售额] > 5000,
    销售[地区] = "北京"
)

4.2 FILTER

FILTER 返回一个按条件过滤后的表,常与 CALCULATE 配合使用。

高端产品销售 = 
CALCULATE(
    SUM(销售[销售额]),
    FILTER(
        ALL(产品[产品名称]),
        [销售额] > 10000
    )
)

4.3 ALL 系列函数

函数 说明
ALL() 移除所有筛选器,返回完整表/列
ALLEXCEPT() 移除指定列之外的所有筛选器
ALLSELECTED() 移除当前视觉对象的筛选器,保留页面/报表级筛选
总销售额(忽略所有筛选) = 
CALCULATE(
    SUM(销售[销售额]),
    ALL()
)

5. 上下文的概念

理解"上下文"是掌握 DAX 的关键。

5.1 行上下文(Row Context)

计算列内部的上下文,指当前行。

利润率 = DIVIDE([销售额] - [成本], [销售额])

在第5行计算时,[销售额][成本] 取的是第5行的值。

5.2 筛选上下文(Filter Context)

度量值被计算时,报表中所有筛选条件(切片器、视觉对象筛选、页面筛选等)的组合。

把"筛选上下文"理解为:度量值计算时,当前的"分析视角"是什么。

5.3 迭代函数

SUMXAVERAGEXCOUNTX 等带 X 的函数称为迭代函数,它们会对表中的每一行进行计算,然后汇总结果。

示例

订单利润 = 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 代替除法:避免除零导致空白或错误
    利润率 = DIVIDE([利润], [销售额])
    
  4. 善用变量:使用 VAR 提升可读性和性能
    总利润 = 
    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 的高级用法。