PowerBI_Chapter6:DAX

`

文章目录

  • 前言
  • [一、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 functions

    DAX也被称为函数语言,完整代码都放在函数内部。

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表达式)
定义 预定义的操作或计算单元,是公式的基本构件。 由函数、运算符、常量及引用组合而成的完整计算公式。
作用 执行特定动作(如求和、判断、日期计算等)。 定义如何计算、返回或转换数据,产生最终结果。
组成 单一功能块(如 SUMIFCALCULATE)。 可包含多个函数、运算符、列引用和常量(如 SUM(Sales[Amount]) * 1.1)。
返回类型 通常返回标量值或表(取决于函数类型)。 可返回标量、表或布尔值,取决于表达式用途(度量、计算列、计算表等)。
使用场景 作为表达式的一部分被调用,不能独立存在。 可独立创建为度量、计算列、计算表或行级安全规则。
示例 SUMAVERAGEIFCALCULATEDATESYTD 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]) or Merge = '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)

  1. DAX 三大表达式类型 -- 计算列(逐行存储)、度量(动态即时)、计算表(返回表)。
  2. CALCULATE 核心用法 -- 修改筛选上下文(添加/删除/覆盖),结合FILTER、ALL等函数。
  3. 时间智能函数 -- TOTALYTD, DATESYTD, DATESMTD, DATESINPERIOD, SAMEPERIODLASTYEAR(需日期表)。
  4. 度量特性 -- 可加性(全维度求和)、半可加性(不跨时间)、不可加性(用平均/比率)。
  5. 显式 vs 隐式度量 -- 显式可重用、可控;隐式快捷但局限。