Lazy loaded imagePowerQuery功能详解之添加自定义列

type
status
date
slug
summary
tags
category
icon
password
 
“添加自定义列”是Power Query的核心功能,它允许你根据表里每一行中已有的数据,通过自定义公式(如计算、文本拼接或逻辑判断)来创建一列全新的、自动更新的数据列, 无论多么复杂的应用,都源于这个核心思想。

添加自定义列要点分解

  • 做什么? 创建一个新列。
  • 基于什么? 用同一行里其他列的数据。
  • 怎么做? 写一个公式(M语言)。
  • 为什么强大? 这个过程是自动化的,原始数据更新后,只需刷新,新列就会自动重新计算。

这个功能是Power Query中最强大、最灵活的工具之一,几乎是所有数据处理和转换的核心。以下是为大家整理、总结的,在我们财务BP的日常工作中,“添加自定义列”在各种场景下的具体应用场景,从基础到高级:

数学和数值计算

这是最直观的用法,类似于在 Excel 单元格里写公式。
  • 场景示例:
    • 计算销售额: [数量] * [单价]
    • 计算利润: [售价] - [成本]
    • 计算折扣金额: [原价] * [折扣率]
    • 计算增长率: ([今年销量] - [去年销量]) / [去年销量]
    • 单位换算: [公斤数] * 1000 (转换为克)
    • 计算含税价: [税前价] * (1 + [税率])

文本处理和拼接

当需要对文本数据进行合并、拆分、提取或格式化时,这个功能非常强大。
  • 场景示例:
    • 合并姓名: [姓] & [名] 或 [FirstName] & " " & [LastName]
    • 创建唯一的ID: [订单ID] & "-" & [产品编码]
    • 提取关键信息: Text.Start([身份证号], 6) (提取地址码)
    • 构建网址链接: "https://www.example.com/products/" & [产品ID]
    • 统一文本格式: Text.Upper([产品型号]) (将所有型号转为大写,便于匹配)
    • 清理文本: Text.Trim([ 姓名 ]) (清除姓名两边的多余空格)

条件逻辑判断

这是该功能最核心、最常用的高级用法,相当于Excel中的IF函数,但可以构建更复杂的逻辑。
  • 场景示例:
    • 数据分组或分类 (Categorization):
      • if [分数] >= 60 then "及格" else "不及格"
      • if [年龄] < 18 then "未成年" else if [年龄] <= 60 then "中青年" else "老年"
    • 创建状态标签或标志 (Flagging):
      • if [库存量] = 0 then "缺货" else if [库存量] < 10 then "低库存警告" else "库存充足"
      • if [到期日] < DateTime.LocalNow() then "已过期" else "正常"
    • 根据条件进行不同的计算:
      • if [客户等级] = "VIP" then [销售额] * 0.1 else [销售额] * 0.05 (计算不同等级客户的积分)
      • if [地区] = "华北" then [运费] * 1.2 else [运费] (对特定地区加收运费)

日期和时间计算

所有与时间相关的衍生数据都可以通过自定义列生成。
  • 场景示例:
    • 计算年龄: Duration.Days(DateTime.LocalNow() - [出生日期]) / 365
    • 计算订单处理天数: Duration.Days([发货日期] - [下单日期])
    • 提取日期部分: Date.Year([日期]), Date.Month([日期]), Date.DayOfWeekName([日期]) (提取年、月、星期几)
    • 计算财务季度: "Q" & Text.From(Date.QuarterOfYear([日期])) (生成如 "Q1", "Q2" 的格式)
    • 计算合同到期提醒日: Date.AddDays([合同结束日期], -30) (获取到期前30天的日期)

数据转换与规整

在数据清洗阶段,用于将不规范的数据转换成统一、干净的格式。
  • 场景示例:
    • 处理空值 (Null)if [折扣率] = null then 0 else [折扣率] (将空的折扣率视为0,避免后续计算出错)
    • 创建复合主键: [部门ID] & "_" & [员工工号] (用于在数据建模时创建唯一标识)
    • 数据类型转换: Text.From([邮政编码]) (将数字格式的邮编转为文本,防止前面的0丢失)

更高级的M函数应用

自定义列的公式框实际上是一个M语言的编辑器,你可以调用任何M函数来执行复杂操作。
  • 场景示例:
    • 处理复杂文本Text.Split([产品标签], ",") (将一个包含多个标签的单元格拆分成一个列表)
    • 错误处理try [收入] / [人数] otherwise 0 (尝试进行除法计算,如果出错则返回0,防止整个查询失败)
    • 调用其他查询或自定义函数: fxMyCustomFunction([参数列]) (在企业级应用中,可以复用已写好的复杂逻辑)

写在最后的思考

所以,“添加自定义列”是 Power Query 中从原始数据到洞察分析的桥梁。它不仅仅是一个“计算器”,更是一个强大的数据塑造数据丰富工具。在任何时候,当你发现现有数据无法直接满足你的分析需求,需要创造一个新维度、新标签、新度量时,第一个应该想到的就是“添加自定义列”。
“添加自定义列”这个功能,完美体现了数据处理的核心原则:先“横向”处理好每一条记录,再“纵向”进行聚合分析。
  1. 第一步:在 Power Query 中“横向”丰富记录。
      • “添加自定义列” 的工作是在 行级别 展开的。它针对 每一条独立的记录 进行计算,比如 [单价] * [数量] 来得到该行的“销售额”。
      • 它的核心任务是 塑造和丰富数据,让每一行信息都更完整,但 绝不进行“纵向”的合计。输出的是一张干净、整洁的原始记录清单。
  1. 第二步:在分析工具中“纵向”聚合结果。
      • 当干净的数据加载到Power BI Excel数据模型后,我们才开始考虑合计
      • 这里的合计是通过 度量值 (Measures) 或数据透视表等功能,对 整列数据 进行的 纵向聚合(如 SUM([销售额]))。
行是记录,合计是分析。
Power Query 横向处理行,负责准备数据;
Power BI/DAX 纵向聚合列,负责得出结论。
这是一个 “先处理,后分析” 的清晰分层逻辑,也是现代数据分析的基础。
 

如果本篇文章对您有帮助或启发,请帮我们点赞、转发、推荐、关注,让更多想转型财务BP、锻造数据分析和可视化洞察能力的财务同行们看到,关注【老汪洞察】,不迷路!
 
温馨提示
🙏🏻
如果您不想错过【老汪洞察】的文章,请将我们设为"星标",这样每次最新文章推送才会第一时间出现在您的订阅列表里。 方法:点击文章页面左上角蓝色文字“老汪洞察”进入主页,点击关注后,再点主页右上角"...",然后选择"设为星标",即可完成,感谢您的支持。
上一篇
PowerQuery功能详解之逆透视列和透视列
下一篇
PowerBI、PowerQuery中什么是事实表和维度表?
Loading...
文章列表
让财税成为经营的力量
电脑与网络
从Power Query到Power BI,入门到精通
知识运用