`
文章目录
- 前言
- [一、DAX Overview / DAX 概述](#一、DAX Overview / DAX 概述)
-
- [(一)What is DAX? / 什么是DAX?](#(一)What is DAX? / 什么是DAX?)
-
- [1. Definition 定义](#1. Definition 定义)
- [2. Data Types 数据类型](#2. Data Types 数据类型)
- [3. Key Capabilities 核心能力](#3. Key Capabilities 核心能力)
- [(二)Why Learn DAX? / 为什么要学DAX?](#(二)Why Learn DAX? / 为什么要学DAX?)
- [二、DAX Syntax / DAX 语法](#二、DAX Syntax / DAX 语法)
-
- [(一)Formula Structure / 公式结构](#(一)Formula Structure / 公式结构)
-
- [1. Example 示例](#1. Example 示例)
- [2. Elements 组成元素](#2. Elements 组成元素)
- [3. Plain Language Reading 通俗解读](#3. Plain Language Reading 通俗解读)
- [三、Types of DAX Expressions / DAX 表达式类型](#三、Types of DAX Expressions / DAX 表达式类型)
-
- [(一)Calculated Columns / 计算列](#(一)Calculated Columns / 计算列)
- [(二)Measures / 度量值](#(二)Measures / 度量值)
- [(三)Calculated Tables / 计算表](#(三)Calculated Tables / 计算表)
- [(四)Row-Level Security Expressions / 行级安全表达式](#(四)Row-Level Security Expressions / 行级安全表达式)
- [四、Common DAX Functions by Category / 常用DAX函数分类](#四、Common DAX Functions by Category / 常用DAX函数分类)
-
- [(一)Aggregation Functions / 聚合函数](#(一)Aggregation Functions / 聚合函数)
- [(二)Logical Functions / 逻辑函数](#(二)Logical Functions / 逻辑函数)
- [(三)Text Functions / 文本函数](#(三)Text Functions / 文本函数)
- [(四)Date and Time Functions / 日期与时间函数](#(四)Date and Time Functions / 日期与时间函数)
- [(五)Filter Functions / 筛选函数](#(五)Filter Functions / 筛选函数)
- [(六)Mathematical Functions / 数学函数](#(六)Mathematical Functions / 数学函数)
- [(七)Information Functions / 信息函数](#(七)Information Functions / 信息函数)
- [(八)Time Intelligence Functions / 时间智能函数](#(八)Time Intelligence Functions / 时间智能函数)
- [五、Calculated Columns in Detail / 计算列详解](#五、Calculated Columns in Detail / 计算列详解)
-
- [(一)Mathematical Functions / 数学函数示例](#(一)Mathematical Functions / 数学函数示例)
- [(二)Date Functions / 日期函数示例](#(二)Date Functions / 日期函数示例)
- [(三)Text Functions / 文本函数示例](#(三)Text Functions / 文本函数示例)
- [(四)Logical Functions / 逻辑函数示例](#(四)Logical Functions / 逻辑函数示例)
- [(五)Information Functions / 信息函数示例](#(五)Information Functions / 信息函数示例)
- [六、DAX Measures / DAX 度量值](#六、DAX Measures / DAX 度量值)
-
- [(一)Definition 定义](#(一)Definition 定义)
- [(二)Types of Measures / 度量类型](#(二)Types of Measures / 度量类型)
-
- [1. Implicit Measures / 隐式度量](#1. Implicit Measures / 隐式度量)
- [2. Explicit Measures / 显式度量](#2. Explicit Measures / 显式度量)
- [(三)Aggregation Functions Used in Measures / 度量中常用的聚合函数](#(三)Aggregation Functions Used in Measures / 度量中常用的聚合函数)
- [七、CALCULATE Function / CALCULATE 函数](#七、CALCULATE Function / CALCULATE 函数)
-
- [(一)Purpose 作用](#(一)Purpose 作用)
- [(二)Adding Filters with CALCULATE / 使用CALCULATE添加筛选](#(二)Adding Filters with CALCULATE / 使用CALCULATE添加筛选)
- [(三)Adding Filters with FILTER() / 使用FILTER()添加筛选](#(三)Adding Filters with FILTER() / 使用FILTER()添加筛选)
- [(四)Removing Filters / 移除筛选](#(四)Removing Filters / 移除筛选)
- [(五)Updating Filters / 更新筛选](#(五)Updating Filters / 更新筛选)
- [八、Time Intelligence Functions / 时间智能函数](#八、Time Intelligence Functions / 时间智能函数)
-
- [(一)Prerequisites / 前提条件](#(一)Prerequisites / 前提条件)
- [(二)Key Functions / 关键函数](#(二)Key Functions / 关键函数)
-
- [1. DATESYTD() / 年初至今日期表](#1. DATESYTD() / 年初至今日期表)
- [2. DATESMTD() / 月初至今日期表](#2. DATESMTD() / 月初至今日期表)
- [3. TOTALYTD() / 年初至今总计](#3. TOTALYTD() / 年初至今总计)
- [4. DATESINPERIOD() / 指定周期日期表](#4. DATESINPERIOD() / 指定周期日期表)
- [5. SAMEPERIODLASTYEAR() / 去年同期日期表](#5. SAMEPERIODLASTYEAR() / 去年同期日期表)
- [6. PREVIOUSYEAR() / 前一年](#6. PREVIOUSYEAR() / 前一年)
- [九、Replace Implicit Measures with Explicit Measures / 用显式度量替换隐式度量](#九、Replace Implicit Measures with Explicit Measures / 用显式度量替换隐式度量)
-
- [(一)Why Replace? / 为什么要替换?](#(一)Why Replace? / 为什么要替换?)
- [(二)Best Practice / 最佳实践](#(二)Best Practice / 最佳实践)
- [十、Characteristics of Measures / 度量的特性](#十、Characteristics of Measures / 度量的特性)
-
- [(一)Additive Measures / 可加性度量](#(一)Additive Measures / 可加性度量)
- [(二)Semi-Additive Measures / 半可加性度量](#(二)Semi-Additive Measures / 半可加性度量)
- [(三)Non-Additive Measures / 不可加性度量](#(三)Non-Additive Measures / 不可加性度量)
- [十一、Quick Measures / 快速度量](#十一、Quick Measures / 快速度量)
- [总结 / Summary](#总结 / Summary)
-
- [核心考点(Top 5)](#核心考点(Top 5))
前言
本文是Power BI Desktop第六章"DAX(数据分析表达式)"的期末复习笔记,结合教材与考试重点整理。内容涵盖:DAX基础语法、计算列、度量值、计算表、常用函数(聚合、逻辑、文本、日期、信息)、CALCULATE筛选操纵、时间智能函数、度量特性及隐式替换。
一、DAX Overview / DAX 概述
(一)What is DAX? / 什么是DAX?
1. Definition 定义
-
DAX (Data Analysis Expressions) is a formula expression language used in Power BI , Excel, and other BI tools for creating custom calculations and aggregations on data models .
DAX(数据分析表达式) 是一种公式表达式语言,用于在Power BI、Excel等BI工具中对数据模型创建自定义计算和聚合。
-
DAX is also known as function language , where the full code is kept inside a function.
a collection of functionsDAX也被称为函数语言,完整代码都放在函数内部。
2. Data Types 数据类型
- Numeric: integers, currency, decimals. / 数值型:整数、货币、小数。
- Other: string, binary object. / 其他:字符串、二进制对象。
3. Key Capabilities 核心能力
- Perform Calculations: Use built-in functions for math, stats, logic, and text operations. / 执行计算:使用内置函数进行数学、统计、逻辑和文本操作。
- Aggregate Data: Use SUM, AVERAGE, COUNT, etc., including running totals and moving averages. / 聚合数据:使用SUM、AVERAGE、COUNT等,包括运行总和和移动平均。
- Time Intelligence: Year-over-year, cumulative totals, date-based filtering. / 时间智能:同比、累计总计、基于日期的筛选。
- Create Relationships: Work across multiple tables. / 创建关系:跨多个表计算。
- Filter Context: Dynamic analysis based on user selections. / 筛选上下文:基于用户选择的动态分析。
(二)Why Learn DAX? / 为什么要学DAX?
- Extract actionable insights from data. / 从数据中提取可操作的见解。
- Solve business problems affecting decision-making and bottom line. / 解决影响决策和利润的业务问题。
- Create sophisticated calculations, dynamic reports, and advanced capabilities (time intelligence, conditional logic). / 创建复杂计算、动态报表和高级功能(时间智能、条件逻辑)。
二、DAX Syntax / DAX 语法
(一)Formula Structure / 公式结构
1. Example 示例
T o t a l S a l e s = S U M ( S a l e s S a l e s A m o u n t ) Total Sales = SUM(SalesSalesAmount) TotalSales=SUM(SalesSalesAmount)
2. Elements 组成元素
- Measure Name :
Total Sales-- name that appears in report. / 度量名称。 - Equals sign (=): Indicates beginning of formula. / 等号,表示公式开始。
- DAX Function :
SUM-- defines the calculation. / DAX函数,定义计算。 - Parentheses (): Surround arguments. / 括号,包围参数。
- Table Reference :
Sales-- table containing data. / 表引用。 - Column Reference :
[SalesAmount]-- column to aggregate. / 列引用。
3. Plain Language Reading 通俗解读
"For the measure named Total Sales , calculate the SUM of values in the
[SalesAmount]column in the Sales table.""对于名为总销售额 的度量,计算Sales表中
[SalesAmount]列的SUM。"
三、Types of DAX Expressions / DAX 表达式类型
(一)Calculated Columns / 计算列
- Row-by-row computation, stored in the table. / 逐行计算,存储在表中。
- Use cases: Filters/slicers, intermediate steps, specific conditions (e.g., categorizing sales as "High/Medium/Low"). / 用途:筛选/切片器、中间步骤、特定条件判断。
- Example :
Status = IF(Sales[Total_Sales] > 1000, "Good", "Bad")
(二)Measures / 度量值
- Dynamic calculations evaluated on the fly based on filter context. Not stored. / 动态计算,基于筛选上下文实时评估,不存储。
- Use cases: Aggregations like totals, averages, percentages. / 用途:求和、平均、百分比等聚合。
- Example :
Total Sales = SUM(Sales[SalesAmount])
(三)Calculated Tables / 计算表
- DAX expressions that return entire tables , used for modeling or creating subsets. / 返回整个表的DAX表达式,用于建模或创建子集。
- Example :
TopSales = FILTER(Sales, Sales[SalesAmount] > 1000)
(四)Row-Level Security Expressions / 行级安全表达式
- Define filters in security roles to restrict data access. / 在安全角色中定义筛选器以限制数据访问。
- Example :
[Region] = "North America"
| 对比维度 | DAX Functions(DAX函数) | DAX Expressions(DAX表达式) |
|---|---|---|
| 定义 | 预定义的操作或计算单元,是公式的基本构件。 | 由函数、运算符、常量及引用组合而成的完整计算公式。 |
| 作用 | 执行特定动作(如求和、判断、日期计算等)。 | 定义如何计算、返回或转换数据,产生最终结果。 |
| 组成 | 单一功能块(如 SUM、IF、CALCULATE)。 |
可包含多个函数、运算符、列引用和常量(如 SUM(Sales[Amount]) * 1.1)。 |
| 返回类型 | 通常返回标量值或表(取决于函数类型)。 | 可返回标量、表或布尔值,取决于表达式用途(度量、计算列、计算表等)。 |
| 使用场景 | 作为表达式的一部分被调用,不能独立存在。 | 可独立创建为度量、计算列、计算表或行级安全规则。 |
| 示例 | SUM、AVERAGE、IF、CALCULATE、DATESYTD。 |
Total Sales = SUM(Sales[SalesAmount])(度量表达式); Status = IF(Sales[Amount] > 1000, "High", "Low")(计算列表达式)。 |
| 是否可单独使用 | 否,必须嵌入表达式中。 | 是,可独立保存在模型中(如度量、计算列)。 |
| 核心关系 | 函数是表达式的"原材料",表达式是函数的"容器"和"调用者"。 | 表达式通过调用一个或多个函数,并搭配运算符和引用,完成具体业务逻辑。 |
四、Common DAX Functions by Category / 常用DAX函数分类
(一)Aggregation Functions / 聚合函数
SUM(),AVERAGE(),MIN(),MAX(),COUNT(),DISTINCTCOUNT(),COUNTROWS()
(二)Logical Functions / 逻辑函数
IF(),AND(),OR(),SWITCH()
(三)Text Functions / 文本函数
CONCATENATE(),LEFT(),RIGHT(),LEN(),UPPER(),LOWER(),REPLACE(),SUBSTITUTE(),SEARCH(),FIND(),FORMAT(),TRIM(),CLEAN()
(四)Date and Time Functions / 日期与时间函数
YEAR(),MONTH(),DAY(),TODAY(),NOW(),DATEDIFF(),DATE()
(五)Filter Functions / 筛选函数
CALCULATE(),FILTER(),ALL(),ALLEXCEPT()
(六)Mathematical Functions / 数学函数
ROUND(),CEILING(),FLOOR(),MOD(),POWER(),DIVIDE()
(七)Information Functions / 信息函数
ISBLANK(),ISERROR(),ERROR(),ISNUMBER(),ISTEXT(),ISNONTEXT(),ISEVEN(),ISODD()
(八)Time Intelligence Functions / 时间智能函数
TOTALYTD(),DATESYTD(),DATESMTD(),DATESINPERIOD(),SAMEPERIODLASTYEAR(),PREVIOUSYEAR()
五、Calculated Columns in Detail / 计算列详解
(一)Mathematical Functions / 数学函数示例
Sales = Sales[SellingPrice] * Sales[Quantity]Avg_Sales = DIVIDE(Sales[Sales], Sales[SellingPrice])Power = POWER(Sales[Quantity], 2)
(二)Date Functions / 日期函数示例
- Extract components:
Year = Sales[SaleDate].[Year],Month = Sales[SaleDate].[Month],Day = Sales[SaleDate].[Day] - Current date:
Current_date = TODAY(),CurrentDateTime = NOW() - Difference:
DaysOpen = DATEDIFF(Customer[StartDate], Customer[EndDate], DAY) - Age:
Age = DATEDIFF(Sales[SaleDate], TODAY(), DAY) - Create date:
Custom_Date = DATE(2025,3,1) - Format:
Custom_Date = FORMAT(DATE(2025,3,1), "yyyy-mm-dd")
(三)Text Functions / 文本函数示例
- Concatenate:
Merge = CONCATENATE('product'[Product], 'product'[Category])orMerge = 'product'[Product] & " | " & 'product'[Category] - Case:
Lower = LOWER('product'[Product]),Upper = UPPER('product'[Product]) - Length:
len = LEN('product'[Product]) - Extract:
short_name = LEFT('product'[Product], 3),RIGHT(...) - Search:
Search = IFERROR(SEARCH("Oak", Customer[Address]), BLANK()) - Replace:
NewName = REPLACE(Customer[Name], 1, 4, "Mr.") - Substitute:
NewCol = SUBSTITUTE(Table[description], "laptop", "tablet")
(四)Logical Functions / 逻辑函数示例
- Simple IF:
Status = IF(Sales[Sales] > 1000, "Good", "Bad") - AND:
Flag = IF(Sales[SellingPrice] > 1000 && Sales[Quantity] > 2, "Valid", "Invalid") - OR:
Status = IF(Sales[Sales] || Sales[SellingPrice] > 1000, "Good", "Bad") - SWITCH (multiple conditions):
Grade = SWITCH(TRUE(), Sales[Sales] >= 3000, "High Profit", Sales[Sales] >= 2000, "Profit", Sales[Sales] >= 1000, "No Profit", "Loss" )
(五)Information Functions / 信息函数示例
ISBLANK(Customer[Name])ISNUMBER(Customer[CustomerID])ISTEXT(Customer[CustomerID])ERROR(Customer[Address])
六、DAX Measures / DAX 度量值
(一)Definition 定义
-
A Measure is a calculated field written in DAX that performs calculations dynamically based on user interactions (filters, slicers, visuals).
度量是用DAX编写的计算字段,根据用户交互(筛选器、切片器、视觉对象)动态执行计算。
-
Measures do not store data ; they calculate results on the fly .
度量不存储数据 ,而是即时计算结果。
(二)Types of Measures / 度量类型
1. Implicit Measures / 隐式度量
- Automatically created by Power BI when you drag a numeric column into a visual. / 将数字列拖入视觉对象时,Power BI自动创建。
- Limitations: No custom logic, not reusable, not visible in Fields pane. / 局限:无自定义逻辑,不可重用,不在字段窗格显示。
2. Explicit Measures / 显式度量
- Manually created using DAX formula bar. / 使用DAX公式栏手动创建。
- Advantages: Reusable, full control over logic and formatting, visible with calculator icon. / 优点:可重用,完全控制逻辑和格式,带计算器图标显示。
(三)Aggregation Functions Used in Measures / 度量中常用的聚合函数
SumOfSales = SUM(Sales[Sales])Average = AVERAGE(Sales[Sales])Total_count = COUNT(Sales[SaleID])Dis_count = DISTINCTCOUNT(Sales[ProductID])
七、CALCULATE Function / CALCULATE 函数
(一)Purpose 作用
- CALCULATE() modifies the filter context of a calculation. It allows you to add, remove, or override filters dynamically.
CALCULATE() 用于修改计算的筛选上下文,允许动态添加、删除或覆盖筛选器。
(二)Adding Filters with CALCULATE / 使用CALCULATE添加筛选
- Single filter:
Laptop_Sale = CALCULATE([SumOfSales], Sales[ProductID] = "P001") - Multiple values (IN):
Sales_Laptop_Phone = CALCULATE([SumOfSales], Sales[ProductID] IN {"P001", "P002"}) - Multiple columns (AND):
MotorCycle Sales 2023 = CALCULATE([TotalOfSales], products[productLine] = "Motorcycles", orders[year] = 2023)
(三)Adding Filters with FILTER() / 使用FILTER()添加筛选
FILTER()returns a table of filtered data and is used inside CALCULATE.
JanSales = CALCULATE([SumOfSales], FILTER(sales, Sales[Month] = "January"))- Multiple conditions:
JanSalesmorethan1000 = CALCULATE([Total Sales], FILTER(sales, Sales[salesprice] > 1000 && Sales[Month] = "January"))
(四)Removing Filters / 移除筛选
- Remove filter on a single column :
ProfitAllproducts = CALCULATE([Laptop_mobile], ALL(Sales[ProductID])) - Remove all filters from a whole table :
Profit All Sales Territories = CALCULATE([Total Profit], ALL(Sales))
(五)Updating Filters / 更新筛选
- Abbreviated filter:
City[SalesTerritory] = "New England"
Equivalent to:FILTER(ALL(City[SalesTerritory]), City[SalesTerritory] = "New England")
八、Time Intelligence Functions / 时间智能函数
(一)Prerequisites / 前提条件
- Need a Date table with unique date values, marked as a date table. / 需要一个具有唯一日期值的日期表,并标记为日期表。
- Most time intelligence functions return tables of dates used as filters in CALCULATE. / 大多数时间智能函数返回日期表,用作CALCULATE中的筛选器。
(二)Key Functions / 关键函数
1. DATESYTD() / 年初至今日期表
- Returns all dates from Jan 1st to the current date in context. / 返回从1月1日到当前上下文中日期的所有日期。
DatesYTD = CALCULATE([SumOfSales], DATESYTD(Sales[SaleDate]))
2. DATESMTD() / 月初至今日期表
- Returns all dates from the start of the month to the current date. / 返回从月初到当前日期的所有日期。
DatesMTD = CALCULATE([SumOfSales], DATESMTD(Sales[SaleDate]))
3. TOTALYTD() / 年初至今总计
- Directly calculates YTD total without CALCULATE wrapper. / 直接计算年初至今总计,无需CALCULATE包裹。
SalesYTD = TOTALYTD([SumOfSales], Sales[SaleDate])
4. DATESINPERIOD() / 指定周期日期表
- Returns a table of dates for a specified period before/after a given date. / 返回给定日期前后指定时间段的日期表。
Last10days = CALCULATE([SumOfSales], DATESINPERIOD(Sales[SaleDate], "04-10-2025", -10, DAY))
5. SAMEPERIODLASTYEAR() / 去年同期日期表
- Returns dates from the same period in the previous year. / 返回去年同期的日期。
Sales LY = CALCULATE(SUM(Sales[SellingPrice]), SAMEPERIODLASTYEAR(Sales[SaleDate]))
6. PREVIOUSYEAR() / 前一年
- Returns all dates of the previous year based on current context. / 基于当前上下文返回前一年的所有日期。
PreviousYr = CALCULATE([SumOfSales], PREVIOUSYEAR(Sales[SaleDate]))
九、Replace Implicit Measures with Explicit Measures / 用显式度量替换隐式度量
(一)Why Replace? / 为什么要替换?
- Implicit measures lack control (no custom filtering, formatting, or logic). / 隐式度量缺乏控制。
- They can't be reused across visuals. / 不可跨视觉对象重用。
- They're not visible in the Fields pane. / 在字段窗格中不可见。
- Explicit measures make your model cleaner , more powerful , and maintainable . / 显式度量使模型更干净 、强大 且可维护。
(二)Best Practice / 最佳实践
- Always create explicit measures for any calculation that will be used in multiple visuals or needs complex logic. / 任何将在多个视觉对象中使用或需要复杂逻辑的计算,都应创建显式度量。
十、Characteristics of Measures / 度量的特性
(一)Additive Measures / 可加性度量
- Can be summed across all dimensions (time, geography, product, etc.). / 可跨所有维度(时间、地理、产品等)求和。
- Examples: Sales Amount, Units Sold, Revenue, Cost. / 示例:销售额、销量、收入、成本。
(二)Semi-Additive Measures / 半可加性度量
- Can be added across some dimensions (e.g., region, product) but not across time . / 可跨某些维度 (如地区、产品)求和,但不能跨时间。
- Examples: Inventory (take last value), Bank Balance, Account Balance. / 示例:库存(取最后值)、银行余额、账户余额。
(三)Non-Additive Measures / 不可加性度量
- Cannot be added across any dimension ; must use special aggregations like average, ratio, or distinct count. / 不能跨任何维度求和,必须使用平均、比率、非重复计数等特殊聚合。
- Examples: Profit Margin (%), Conversion Rate, Average Price, Customer Satisfaction Score. / 示例:利润率(%)、转化率、平均价格、客户满意度评分。
十一、Quick Measures / 快速度量
-
In Power BI, Quick Measures are predefined DAX calculations that allow you to easily create common and complex measures without manually writing DAX code .
在Power BI中,快速度量 是预定义的DAX计算,允许你无需手动编写DAX代码即可轻松创建常见和复杂的度量。
-
They are a great starting point for learning DAX syntax. / 它们是学习DAX语法的良好起点。
总结 / Summary
核心考点(Top 5)
- DAX 三大表达式类型 -- 计算列(逐行存储)、度量(动态即时)、计算表(返回表)。
- CALCULATE 核心用法 -- 修改筛选上下文(添加/删除/覆盖),结合FILTER、ALL等函数。
- 时间智能函数 -- TOTALYTD, DATESYTD, DATESMTD, DATESINPERIOD, SAMEPERIODLASTYEAR(需日期表)。
- 度量特性 -- 可加性(全维度求和)、半可加性(不跨时间)、不可加性(用平均/比率)。
- 显式 vs 隐式度量 -- 显式可重用、可控;隐式快捷但局限。