DAX(Data Analysis Expressions)是 Power BI、Analysis Services 和 Power Pivot 的公式表达式语言。本篇整理 DAX 核心概念:运算符、语句、上下文与数据表引用规则。

📌 什么是 DAX?

DAX(Data Analysis Expressions,数据分析表达式)是一种用于 Power BI、Analysis Services 和 Power Pivot in Excel 数据模型的公式表达式语言。DAX 公式包括函数、运算符和值,可对相关表和列中的数据执行高级计算和查询。

DAX 的应用场景

  • 度量值(Measures) - 动态计算公式,结果根据上下文变化
  • 计算列(Calculated Columns) - 在现有表中添加新列并用公式定义其值
  • 计算表(Calculated Tables) - 基于公式表达式计算生成新表
  • 行级安全性(Row-Level Security) - 使用 DAX 公式定义数据访问权限

DAX 公式基础

= TODAY()
在计算列的每一行插入今天的日期

= [Column1] + [Column2]
将同一行中 [Column1] 和 [Column2] 的值相加

= SUM('Sales'[Amount])
对 Sales 表的 Amount 列求和

🔧 DAX 运算符

算术运算符

运算符 含义 示例
+ [Sales] + [Tax]
- [Price] - [Discount]
* [Quantity] * [UnitPrice]
/ [Revenue] / [Units]
^ 乘方 [Base] ^ 2

比较运算符

运算符 含义 示例
= 等于 [Status] = "Active"
<> 不等于 [Status] <> "Inactive"
> 大于 [Score] > 80
< 小于 [Age] < 18
>= 大于等于 [Quantity] >= 10
<= 小于等于 [Price] <= 100

逻辑运算符

运算符 含义 说明
&& 逻辑与 两个条件都必须为 TRUE
|| 逻辑或 至少一个条件为 TRUE
NOT 逻辑非 取反条件
IN 在集合中 "Product A" IN {'Product A', 'Product B'}

📝 DAX 语句

EVALUATE 语句

DAX 查询的基本语句,类似于 T-SQL 的 SELECT 语句。

dax
EVALUATE [ORDER BY [ASC | DESC]]

DEFINE + EVALUATE

在查询中定义度量值或变量,然后执行查询。

dax
DEFINE MEASURE Sales[Total Sales] = SUM(Sales[Amount]) EVALUATE SUMMARIZE(Sales, 'Product'[Category], "Total Sales", [Total Sales])

VAR 语句

定义可在表达式中重复使用的变量,提高代码可读性和性能。

dax
VAR TotalSales = SUM('Sales'[Amount]) VAR TotalCost = SUM('Sales'[Cost]) RETURN TotalSales - TotalCost

🎯 DAX 上下文

行上下文(Row Context)

行上下文是指公式"知道"当前正在处理哪一行。在计算列中创建公式时,会自动为表的每一行创建行上下文。

= [Quantity] * [UnitPrice]
公式为每一行计算:数量 × 单价

筛选上下文(Filter Context)

筛选上下文是由数据透视表、图表或报表中的行标签、列标签、切片器和筛选器创建的一组筛选条件。

= SUM('Sales'[Amount])
在报表中按年份筛选时,度量值只计算筛选后的数据

上下文转换

使用 CALCULATE 函数可以将行上下文转换为筛选上下文。

= CALCULATE(SUM('Sales'[Amount]), 'Product'[Category] = "Electronics")
计算电子产品类别的销售总额

📋 DAX 数据表

表引用规则

  • 表名包含空格或特殊字符时必须用单引号括起来:'Sales Data'
  • 列名必须用方括号括起来:[Amount]
  • 引用其他表的列时使用完全限定名:'Sales'[Amount]

常用表函数

函数 说明
VALUES(<table>) 返回指定表的唯一值列表
DISTINCT(<table>) 返回表的唯一值(与 VALUES 类似)
FILTER(<table>, <filter>) 返回满足条件的行
ALL(<table>) 返回所有行,忽略任何筛选器
CALCULATETABLE(<expr>, <filter>) 返回应用了筛选器的表

表关系函数

  • RELATED(<column>) - 从相关表获取单个列值
  • RELATEDTABLE(<table>) - 返回相关表的行集合
  • USERELATIONSHIP(<col1>, <col2>) - 指定要使用的特定关系

由在线工具箱(www.vba.net)整理制作