下面我将从“为什么用”、“参数类型”、“如何创建”、“如何使用”以及“高级应用场景”五个方面,为你详细讲解 Power Query 的参数管理。
为什么使用参数?(核心价值)
在 Power Query 中使用参数,主要有以下几个好处:
- 灵活性:你可以轻松地修改数据源路径、文件名、筛选条件等,而无需深入到复杂的 M 代码中去修改。
- 可维护性:当业务规则变化(如年份、部门名称)时,只需修改参数值,所有引用该参数的查询都会自动更新,避免了“改一处,找多处”的繁琐工作。
- 复用性:你可以在多个查询中引用同一个参数,所有报表都使用同一个“当前年份”参数,当需要切换年份时,只需修改这一个参数即可。
- 自动化与协作:参数是 Power BI 数据集刷新参数和 SSIS 包变量的基础,通过修改参数,可以实现动态的报表刷新或ETL流程控制。
参数的类型
Power Query 中的参数本质上就是一个名称和一个值的配对,支持的值类型非常丰富:
| 参数类型 | 描述 | 示例 |
|---|---|---|
| 文本 | 最常用的类型,用于存储字符串。 | 文件路径 ("C:\Data\Sales.csv")、服务器名称 ("MyServer")、筛选值 ("2025") |
| 数字 | 用于存储整数或小数。 | 金额阈值 (1000)、ID (123) |
| 逻辑值 | 用于存储 true 或 false。 |
开关 (true/false),用于控制是否执行某个步骤 |
| 日期 | 用于存储日期值。 | 开始日期 (#date(2025,1,1)) |
| 时间 | 用于存储时间值。 | #time(9,0,0) |
| 日期时间 | 用于存储日期和时间值。 | #datetime(2025,1,1,12,0,0) |
| Null | 表示空值。 | 用于清空某个筛选条件 |
| 二进制 | 用于存储二进制数据,如图片。 | 较少在参数中直接使用 |
| 列表 | 用于存储一个值的列表。 | 多个筛选值 {"North", "South", "East"} |
| 记录 | 用于存储键值对集合,类似字典。 | 用于传递多个配置信息,如 =[Path="C:\Data", SheetName="Sales"] |
| 表 | 用于存储一个表结构。 | 较少作为参数,但可以引用其他查询生成的表 |
如何创建和管理参数
创建参数非常简单,主要有两种方式:
通过“管理参数”对话框(推荐)
这是最标准、最清晰的管理方式。
-
打开 Power Query 编辑器:在 Excel 或 Power BI Desktop 中,进入“数据”选项卡,选择“获取数据” -> “查询” -> “编辑查询”。
-
打开管理器:在 Power Query 编辑器中,转到“主页”选项卡,点击“管理参数”。
-
创建新参数:
- 在弹出的“管理参数”对话框中,点击左下角的“新建...”。
- 名称:为参数起一个有意义的名字(
CurrentYear,DataSourcePath)。注意:名称中不能有空格,通常使用 PascalCase 或下划线命名法。 - 描述:添加描述,方便自己或他人理解参数的用途。
- 类型:从下拉菜单中选择参数的类型(选择“数字”)。
- 值:输入参数的默认值(
2025)。 - 可选值:如果希望该参数只能从几个固定值中选择,可以在这里设置,这对于创建“下拉菜单”式的参数非常有用。
- 必需:如果勾选,则使用此参数的查询在参数值为空时会报错。
-
保存并关闭:点击“确定”保存参数,然后关闭对话框,新创建的参数会出现在左侧的“查询”窗格中,它本身就是一个特殊的查询。
直接在查询中创建(快捷方式)
如果你已经在写 M 代码,可以直接定义一个 let...in 结构来创建一个参数。
- 在 Power Query 编辑器中,点击“高级编辑器”。
- 在代码的
let部分定义变量,这个变量就相当于一个参数。
let
// 定义参数
CurrentYear = 2025,
DataSourcePath = "C:\Data\Sales_" & Text.From(CurrentYear) & ".csv",
// 使用参数
Source = Csv.Document(File.Contents(DataSourcePath),[Delimiter=",", Encoding=1252]),
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Sales Amount", Int64.Type}, {"Order Date", type date}}),
// 使用参数进行筛选
#"Filtered Rows" = Table.SelectRows(#"Changed Type", each [Order Date] = #date(CurrentYear, 1, 1))
in
#"Filtered Rows"
如何使用参数
参数创建好后,有两种主要的使用场景。
场景1:在 Power Query 编辑器内部使用
这是最常见的用法,用于构建动态的数据查询逻辑。
示例:动态加载数据
假设你每个月都会收到一个新的销售数据文件 Sales_202501.csv, Sales_202502.csv... 你想通过参数来控制加载哪个月的数据。
-
创建参数:
- 参数名:
ReportMonth - 类型:文本
- 值:
"202501"(代表2025年1月)
- 参数名:
-
创建查询:
- 创建一个名为
DynamicSales的新查询。 - 在高级编辑器中,编写如下代码:
- 创建一个名为
let
// 引用我们创建的参数
MonthParam = Excel.CurrentWorkbook(){[Name="ReportMonth"]}[Content]{0}[Value],
// 使用参数构建文件名
FileName = "Sales_" & MonthParam & ".csv",
FilePath = "C:\Data\" & FileName,
// 使用参数构建完整路径并加载数据
Source = Csv.Document(File.Contents(FilePath),[Delimiter=",", Encoding=1252]),
#"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Sales", Int64.Type}, {"Date", type date}})
in
#"Changed Type"
关键点:通过 Excel.CurrentWorkbook(){[Name="ReportMonth"]}[Content]{0}[Value] 这种语法来引用工作簿中定义的参数,在 Power BI 中,语法是 Value.Metadata(Value.Metadata(#"参数名"))[Query],但更简单的方式是直接在查询中引用参数名(如果参数在同一工作簿中定义)。
场景2:在 Power BI / Excel 报表中使用(交互式参数)
这是参数最强大的应用,允许最终用户通过界面控件来改变报表数据。
示例:Power BI 中的切片器
- 创建参数:按照方式一创建一个名为
SelectedYear的数字参数,值为2025。 - 创建查询:创建一个查询来读取这个参数的值,在 Power BI 中,最简单的方法是创建一个“空查询”并输入以下 M 代码:
let Source = Value.Metadata(Value.Metadata(#"SelectedYear"))[Query] in Source这个查询会返回一个表,其中包含参数的值,将其命名为
GetSelectedYear。 - 创建报表:
- 将你的销售数据拖到报表画布。
- 将
GetSelectedYear查询拖到报表画布,它会自动创建一个“数值”切片器。 - 将这个切片器的类型从“数值”更改为“下拉列表”。
- 应用筛选:在“字段”窗格中,将销售数据中的“年份”字段与
GetSelectedYear的值进行关联,Power BI 通常会自动检测并建议你创建“筛选器”关系。
当你在报表中通过下拉列表选择不同的年份时,Power Query 中的 SelectedYear 参数值会自动更新,整个报表的数据也会随之刷新。
高级应用场景
-
使用记录和列表参数
- 记录参数:当你需要传递多个配置选项时非常有用。
=[SourcePath="C:\Data", FileName="Report.xlsx", SheetName="Data"]。 - 列表参数:用于多选筛选。
SelectedRegions = {"East", "West"},然后在筛选步骤中使用List.Contains(SelectedRegions, [Region])。
- 记录参数:当你需要传递多个配置选项时非常有用。
-
使用逻辑参数作为开关
- 创建一个名为
IncludeInactiveProducts的逻辑参数,默认值为false。 - 在你的查询中,可以这样使用:
#"Filtered Rows" = Table.SelectRows(#"Previous Step", each ([IsActive] = true) or (IncludeInactiveProducts = true))
这样,当开关打开时,会包含所有产品;关闭时,只包含活跃产品。
- 创建一个名为
-
动态SQL查询
- 你可以创建一个文本参数
SQLQuery,值为"SELECT * FROM Sales WHERE Year = 2025"。 - 然后使用
Sql.Database函数来执行这个动态生成的SQL语句。
- 你可以创建一个文本参数
Power Query 参数管理是数据建模的基石,掌握它,意味着你的数据模型将不再是静态的、僵化的,而是动态、灵活且易于维护的。
最佳实践:
- 命名清晰:使用有意义的名称,如
DataSourcePath而不是p1。 - 集中管理:通过“管理参数”对话框来创建和修改,而不是在每个查询里硬编码。
- 善用描述:为每个参数添加描述,解释其用途和可选值。
- 从简单开始:先从文本和数字参数入手,再逐步尝试列表和记录等复杂类型。
希望这份详细的指南能帮助你彻底掌握 Power Query 的参数管理!
