Microsoft Lab
全部软件
Power BI约 10 分钟

DAX 入门:计算列与度量值

重点内容


计算列 vs 度量值

计算列 Calculated column度量值 Measure
建立Table tools›New columnHome›New measure
什么时候算资料刷新时,每一行算一次,存在表里放进图表时,按当下的筛选即时算
占空间会让模型变大几乎不占空间
适合分类、分组(例如「价格区间」)、要拿来当切片器或轴的栏位营业额、利润率、成长率这类汇总数字
在 Data 窗格的图标表格栏位图标(带 fx)计算器图标

📌 判断方法:结果要放在图表的轴、图例、切片器里 → 计算列;结果是要被加总、比较的数字 → 度量值。


第一个度量值

Total Sales = SUM ( Orders[Amount] )
  • Total Sales:度量值名称
  • Orders[Amount]:表名[栏位名]
  • 把这个度量值放进按州属分的柱状图,每根柱子会自动只算那个州属的订单——这就是「按筛选即时计算」

💡 建议新建一个空表专门放度量值:Home›Enter data,表名取 _Measures,建好度量值后把原本的空栏删掉,这个表就会移到 Data 窗格最上面。


常用函数

函数用途例子
SUM加总SUM ( Orders[Amount] )
AVERAGE平均AVERAGE ( Orders[Amount] )
COUNTROWS数有几行COUNTROWS ( Orders ) = 订单数
DISTINCTCOUNT数不重复的值DISTINCTCOUNT ( Orders[CustomerID] ) = 顾客人数
DIVIDE除法,分母是 0 时不会出错DIVIDE ( [Profit], [Total Sales] )
SUMX逐行计算再加总SUMX ( Orders, Orders[Qty] * RELATED ( Products[Cost] ) )
RELATED从「一」那端的表拿值(像 VLOOKUP)RELATED ( Products[Category] )
CALCULATE在改变筛选条件后计算见下面
IF / SWITCH条件判断见计算列例子

实用度量值范例

Total Sales = SUM ( Orders[Amount] )

Order Count = COUNTROWS ( Orders )

Average Order Value = DIVIDE ( [Total Sales], [Order Count] )

Total Cost = SUMX ( Orders, Orders[Qty] * RELATED ( Products[Cost] ) )

Profit = [Total Sales] - [Total Cost]

Profit Margin % = DIVIDE ( [Profit], [Total Sales] )

📌 度量值可以引用其他度量值([Total Sales]),不用每次重写。Profit Margin % 建好后,到 Measure tools›Format 设成百分比。


CALCULATE:DAX 最重要的函数

CALCULATE ( 要算什么, 筛选条件1, 筛选条件2, ... )

Selangor Sales =
CALCULATE ( [Total Sales], Customers[State] = "Selangor" )

Shopee Sales =
CALCULATE ( [Total Sales], Stores[Platform] = "Shopee" )

Sales Share % =
DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], ALL ( Customers[State] ) ) )
  • 第一、二个:不管图表怎么筛,都只算雪兰莪 / Shopee
  • 第三个:ALL 移除州属的筛选,算出「全部州属的营业额」当分母,得到每个州属占总额的百分比

时间智能(需要 EP03 的日期表)

Sales YTD = TOTALYTD ( [Total Sales], 'Date'[Date] )

Sales Last Year =
CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) )

Sales YoY % =
DIVIDE ( [Total Sales] - [Sales Last Year], [Sales Last Year] )

Sales Last Month =
CALCULATE ( [Total Sales], DATEADD ( 'Date'[Date], -1, MONTH ) )
函数算什么
TOTALYTD年初至今累计
SAMEPERIODLASTYEAR去年同期
DATEADD往前 / 往后移几天、几个月、几年

计算列范例

Price Band =
SWITCH (
    TRUE (),
    Orders[Amount] < 50, "RM50 以下",
    Orders[Amount] < 200, "RM50 – 199",
    "RM200 以上"
)

结果是文字分组,可以放进图表的轴或切片器,所以适合用计算列。


写 DAX 的小习惯

  • 度量值名称用清楚的英文或中文,不要 Measure 1
  • Shift+Enter 在公式栏换行,长公式分行写比较好读
  • 除法一律用 DIVIDE,不要用 /,避免分母是 0 时出现错误
  • 引用栏位写完整的 表名[栏位名],引用度量值只写 [度量值名],一看就分得出来

学完你会

常见错误

  • ❌ 用计算列算营业额总和再拖进图表:模型变大,而且切片器筛选后数字可能不对,要用度量值。
  • ❌ 用 / 做除法:分母是 0 时出错,用 DIVIDE。
  • ❌ 没有日期表就用时间智能函数:结果不对或报错,先照 EP03 建日期表并标记。
  • ❌ 把度量值当成栏位放进切片器:度量值不能当切片器,需要分组就用计算列。
  • ❌ 忘了设定百分比格式:利润率显示成 0.23 而不是 23%。

Sources

官方文档:

  1. Learn DAX basics in Power BI Desktop - Microsoft Learn
  2. Create measures for data analysis in Power BI Desktop - Microsoft Learn
  3. Create calculated columns in Power BI Desktop - Microsoft Learn
  4. CALCULATE function (DAX) - Microsoft Learn
  5. DIVIDE function vs. divide operator - Microsoft Learn
  6. Time intelligence functions (DAX) - Microsoft Learn

📝 随堂测验

答完才知道有没有真的学会。答错没关系,每题都有解析。

测验一下共 6 题
只记在你的浏览器里,换设备不会同步。