本篇数据处理来自一个实际处理数据的简化。下图中,假设左边是一个直观的 BOM 结构展示,数据在 Excel 中存储格式如中间部分所示:第一列为物料编码的级别,第二列为物料编码。数据处理任务:需要在 Excel 中增加一列输出物料编码上一级的物料编码(目标为黄色部分)。

image

Excel 处理这种没有明显规律的数据,借助 VBA 比较方便。我的方法是这样的:从第二行开始循环,如果 Level = 1,初始化一个数组 BomMaterials, 如果不等于 1,则根据 level 刷新该级别的物料编码,并且将上级物料的编码写入到 Parent 列。下面的 VBA 代码显示了处理过程。

Public Sub populate_parent()

Dim currSheet As Worksheet

Set currSheet = Sheet3

Dim i As Long

Dim BomMaterials() As String

Dim level As Integer

For i = 2 To 367 ' 数据开始和结束行

level = Range("B" & i).Value

If Range("B" & i).Value = 1 Then

ReDim BomMaterials(1 To 8)

BomMaterials(level) = Range("C" & i).Value

Else

BomMaterials(level) = Range("C" & i).Value

Range("D" & i).Value = BomMaterials(level - 1)

End If

Next

End Sub

现在需要在 Power Query (PQ) 中做相同的处理。将 Excel 工作表的 BOM 数据通过 Ctrl + T 变成 Excel 的 Table,加载到 Power Query 查询编辑器(操作过程可以参考我之前的博客),此时界面如下。为了处理方便,步骤名称我改为了英文。

image

对 BOM查询,添加一个新的条件列,找出每一行物料编码所属的第一级物料编码:

image

image

点击确定按钮,回到查询编辑器,此时界面如下。除了第 1 级,其他级别物料编码为 null。

image

选中 Level1 列,切换到【转换】选项卡,打开【填充】下拉框,选择向下填充。或者在选中这一列后,右键菜单,也有【填充】菜单项。向下填充后,所有 null 值都被自动填充为上一行的值,直到遇到非空值。

image

选中左边 BOM 查询,右键菜单【复制】,将 BOM 复制为一个新的查询,将新查询名改为 BOMGrouped。目前 BOMGrouped 查询和 BOM 查询完全相同。

image

选择 BOMGrouped 查询,选中 Level1 这一列,通过【主页】或者右键菜单中的【分组依据】,打开下面的对话框:

image

注意这里选择:所有行(要点)。

image

通过这种分组的方式,除第一级物料编码之外的所有数据,全部变成一列。Grouped 这一列中的每个单元格,不是一个单值数据,而是 Table 类型的数据,所以将其称为结构化列。我们后面可以对结构化列进行展开 (expand),获得我们想要的数据,这种数据处理方法跟 Excel 有着天壤之别,后面我们还将通过其它示例,领会和掌握结构化列的使用方法。结构化列不仅仅是 Table 类型,如果某一列是 Table、Record 或者 List,则都是结构化列。

image

完成本步骤,BOMGrouped 查询的 M语言脚本如下:

let

Source = Excel.CurrentWorkbook(){[Name="BOM"]}[Content],

ChangedTypes = Table.TransformColumnTypes(Source,

{{"IDX", Int64.Type}, {"Level", Int64.Type}, {"MaterialCode", type text}}),

AddedLevel1 = Table.AddColumn(ChangedTypes, "Level1", each if [Level] = 1 then [MaterialCode] else null),

FilledDown = Table.FillDown(AddedLevel1,{"Level1"}),

GroupedByLevel1 = Table.Group(FilledDown, {"Level1"},

{{"Grouped", each _, type table [IDX=number, Level=number, MaterialCode=text, Level1=text]}})

in

GroupedByLevel1

接下来,选中 BOM 查询,与刚才加工好的 BOMGrouped 查询做一个合并查询 (操作方法可以参考本系列第 9 和第 10 篇 ):

image

完成本步骤后界面如下:

image

需要对 BOMGrouped 列进行展开操作,展开时只保留 Grouped 字段:

image

完成操作后,点击 Grouped 字段,下面已经可以看到 BOM 信息,是 Table 类型的结构化数据:

image

目前这个子表 (sub-table) 包含所有数据,我们需要对其进行筛选。为了方便处理,我们添加一列,值与 Grouped 一样:

image

完成刚才的步骤,高级编辑器中的 M 代码为:

let

Source = Excel.CurrentWorkbook(){[Name="BOM"]}[Content],

ChangedTypes = Table.TransformColumnTypes(Source,{{"IDX", Int64.Type}, {"Level", Int64.Type}, {"MaterialCode", type text}}),

AddedLevel1 = Table.AddColumn(ChangedTypes, "Level1", each if [Level] = 1 then [MaterialCode] else null),

FilledDown = Table.FillDown(AddedLevel1,{"Level1"}),

MergedWithBOMGrouped = Table.NestedJoin(FilledDown, {"Level1"}, BOMGrouped, {"Level1"}, "BOMGrouped", JoinKind.LeftOuter),

ExpandedBOMGrouped = Table.ExpandTableColumn(MergedWithBOMGrouped, "BOMGrouped", {"Grouped"}, {"Grouped"}),

AddedSelectedMaterialCol = Table.AddColumn(ExpandedBOMGrouped, "SelectedMaterial", each [Grouped])

in

AddedSelectedMaterialCol

为了对 Grouped 列包含的字表数据进行筛选,需要用到两个标准款函数:Table.SelectRows 和 Table.Last。

Table.SelectRows(table as table, condition as function) as table

Table.SelectRows 函数根据条件筛选出表中符合条件的记录,返回值是 table

Table.Last(table as table, optional default as any) as any

Table.Last 函数获取 table 中的最后一行,返回值一般是 record。

使用上面两个函数,对最后一个步骤的代码进行变更,变更之前:

AddedSelectedMaterialCol = Table.AddColumn(ExpandedBOMGrouped, "SelectedMaterial", each [Grouped])

首先对 subtable 进行筛选,筛选出 IDX 比主表 IDX 小,物料的 Level 比本 Level 小 1 的所有记录:

AddedSelectedMaterialCol = Table.AddColumn(ExpandedBOMGrouped, "SelectedMaterial",

each Table.SelectRows([Grouped], (x) => x[IDX] <= [IDX] and x[Level] = [Level]-1))

回到查询编辑器界面,子表的筛选条件已经起作用了:

image

然后再对最后一个步骤的代码用 Table.Last 函数,将符合条件的记录从 Table 变成 Record,经这一处理,字表只剩下最后一行符合条件的记录,单元格的数据类型是 Record:

AddedSelectedMaterialCol = Table.AddColumn(ExpandedBOMGrouped, "SelectedMaterial",

each Table.Last(

Table.SelectRows([Grouped],

(x) => x[IDX] <= [IDX] and x[Level] = [Level]-1)))

完成这一个步骤,界面如下:

image

M 语言脚本如下:

let

Source = Excel.CurrentWorkbook(){[Name="BOM"]}[Content],

ChangedTypes = Table.TransformColumnTypes(Source,{{"IDX", Int64.Type}, {"Level", Int64.Type}, {"MaterialCode", type text}}),

AddedLevel1 = Table.AddColumn(ChangedTypes, "Level1", each if [Level] = 1 then [MaterialCode] else null),

FilledDown = Table.FillDown(AddedLevel1,{"Level1"}),

MergedWithBOMGrouped = Table.NestedJoin(FilledDown, {"Level1"}, BOMGrouped, {"Level1"}, "BOMGrouped", JoinKind.LeftOuter),

ExpandedBOMGrouped = Table.ExpandTableColumn(MergedWithBOMGrouped, "BOMGrouped", {"Grouped"}, {"Grouped"}),

AddedSelectedMaterialCol = Table.AddColumn(ExpandedBOMGrouped, "SelectedMaterial",

each Table.Last(Table.SelectRows([Grouped], (x) => x[IDX] <= [IDX] and x[Level] = [Level]-1)))

in

AddedSelectedMaterialCol

读者也可将 M 语言的脚本拷贝到高级编辑器,直接看效果,并且可以进入每一步骤查看数据的变化过程。最后,对 SelectedMaterial 结构化列展开,只保留 MaterialCode 这一列。

image

将列名改为 Parent,并删除不需要的辅助列。完成后的 M 语言脚本:

let

Source = Excel.CurrentWorkbook(){[Name="BOM"]}[Content],

ChangedTypes = Table.TransformColumnTypes(Source,{{"IDX", Int64.Type}, {"Level", Int64.Type}, {"MaterialCode", type text}}),

AddedLevel1 = Table.AddColumn(ChangedTypes, "Level1", each if [Level] = 1 then [MaterialCode] else null),

FilledDown = Table.FillDown(AddedLevel1,{"Level1"}),

MergedWithBOMGrouped = Table.NestedJoin(FilledDown, {"Level1"}, BOMGrouped, {"Level1"}, "BOMGrouped", JoinKind.LeftOuter),

ExpandedBOMGrouped = Table.ExpandTableColumn(MergedWithBOMGrouped, "BOMGrouped", {"Grouped"}, {"Grouped"}),

AddedSelectedMaterialCol = Table.AddColumn(ExpandedBOMGrouped, "SelectedMaterial",

each Table.Last(Table.SelectRows([Grouped], (x) => x[IDX] <= [IDX] and x[Level] = [Level]-1))),

ExpandedMaterialCol = Table.ExpandRecordColumn(AddedSelectedMaterialCol, "SelectedMaterial", {"MaterialCode"}, {"Parent"}),

DeletedCols = Table.RemoveColumns(ExpandedMaterialCol,{"Level1", "Grouped"})

in

DeletedCols

通过【主页】上关闭并上载,将结果数据加载到 Excel 工作表:

image

示例数据已经放到 github - BOMSample.xlsx,方便大家学习。

power query 向下填充_Power Query 系列 (12) - Power Query 结构化列应用案例相关推荐

  1. Power Query 系列 (12) - Power Query 结构化列应用案例

    本篇数据处理来自一个实际处理数据的简化.下图中,假设左边是一个直观的 BOM 结构展示,数据在 Excel 中存储格式如中间部分所示:第一列为物料编码的级别,第二列为物料编码.数据处理任务:需要在 E ...

  2. 填充table_Excel Power Query | 向下填充的逆过程

    上期内容给大家讲解了关于图表精品图表 | Excel绘制"带有阈值分割的条形图和棒棒图"的制作方法.本期给大家讲解一下关于Power Query的知识 . 如下图,将下面的数据向下 ...

  3. Power Query 系列 (01) - Power Query 介绍

    Power Query 介绍 Power Query 是微软提供的工具,Excel 2013 版作为插件加载使用,从 Office 2016 版开始,Power Query 的功能集成到 Excel ...

  4. powerbi导入地图_Power BI系列教程之powerBI功能介绍及使用导引(一)

    作为从事数据分析相关工作的小伙伴,我们总会遇到一些工作是每周.每月甚至每天都是重复做的工作,这个时候我们有没有一种结构化的方法来处理这一些数据呢?答案是肯定的,微软为了满足广大职场数据分析人员的需求, ...

  5. Power BI中的填充功能

    "填充"功能可以看做是一种特殊类型的"填充值",它的功能是将单元格的值填充到当前所选列中相邻空单元格内.相当于以某个单元格为基准,对临近空单元格进行替换.例如下 ...

  6. 结构化查询语言(Structured Query Language)与数据库分类

    结构化查询语言(Structured Query Language),简称SQL,SQL使我们有能力访问数据库,SQL 是一种 ANSI(American National Standards Ins ...

  7. 结构化查询语言(Structured Query Language)

    2019独角兽企业重金招聘Python工程师标准>>> 结构化查询语言(Structured Query Language)简称SQL(发音:/ˈɛs kjuː ˈɛl/ " ...

  8. 在keil uVision 2/uVision 3下使用伟福系列仿真器的方法:

    ★ 在keil uVision 2/uVision 3下使用伟福系列仿真器的方法: 1. 将 E6000.DLL 解压到 X:\KEIL\BIN\目录下,其中 X 为keil的安装驱动器: 2. 用文 ...

  9. Oracle结构化查询语言(Structured Query Language)

    SQL是结构化查询语言(Structured Query Language) 专门用于数据存取.数据更新及数据库管理等操作. 此文后积累学习用SQL语句对数据库的表进行增删改查的操作. 在Oracle ...

最新文章

  1. 第一个SpringBoot程序(详细解析Grounp、Artifact等项目信息含义)
  2. Swift Property Wrapper 属性包装器
  3. 上海图书馆 计算机软件,上海图书馆上海科技情报研究所招聘信息
  4. css画带边框三角形,纯CSS画三角形(带边框)
  5. Gradle Issue: OutOfMemoryError: PermGen space
  6. 浏览Android系统源码的站点
  7. 汽车后市场的大数据引擎谁人可造
  8. ea6500 v1 刷梅林_Linksys EA6500刷ddwrt成功记
  9. 如何在Word中输入英语音标?非常简单好用
  10. 微信公众号发布图文消息次数达到上限
  11. 10 种跨域解决方案(附终极方案)
  12. The run destination iPhone is not valid for running the scheme “xx”
  13. 计算机教师职业幸福感,教师的职业幸福感作文
  14. 比Everything更强的文件搜索工具,支持文件名、文件内容和文件图片上的文字搜索,文件内容搜索工具,文件图片内容搜索工具,OCR图片文本识别搜索,文件快速搜索工具,文字识别文件搜索工具
  15. Java Web3j nonce 获取
  16. 3脚送话器内部电路图_话机送、受话器的修理与电路检修
  17. 恭喜!勇士获得2022NBA总冠军
  18. Latex常用公式总结
  19. php 图片印章_PHP开发,如何高效生成图片印章和水印?
  20. linux杂志软件,Ubuntu 16.04安装电子杂志制作软件 Scribus 1.5.2

热门文章

  1. 北京小升初计算机编程特长生班,北京特长生小升初测试启动 家长凌晨排队取号 图...
  2. 微信小程序采坑四:下拉刷新不回弹
  3. Javascript 合集 自己整理的收藏 记录一下(最下面有惊喜)
  4. 程序员自我提升的5个方法
  5. 奥鹏福建师范计算机应用作业,奥鹏福建师范【计算机应用基础】在线作业一、二答案在末尾...
  6. STC用PCA测量脉宽_超快激光脉冲测量和诊断使用自相关仪
  7. YOLOv5 中 metrics.py 之 ap_per_class compute_ap 学习记录
  8. 微信公众号模板消息推送(PHP)
  9. 面试官常问的问题及回答
  10. Android加载本地大Bitmap文件,解析出来的Bitmap是整张图片是黑色的