Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Microsoft is giving away 50,000 FREE Microsoft Certification exam vouchers. Get Fabric certified for FREE! Learn more

v-stephen-msft

如何在 Power Query 中转化表模型

场景:在很多情况下,我们导入的表模型无法直接在 PowerBI Desktop 中可视化,因为多种属性是以行的形式添加到表记录中的。因此我们首先需要在 Power Query 中转换表模型。

 

最初导入的表格模型如下:

vstephenmsft_0-1732585117864.png

基本思想:

在 PowerBI 中,某个属性的字段特征以列的形式展示,添加的每个行值的数据类型都是相同的。

 

详细步骤:
1. 分析初始表中的行值属性,并在 Power Query 中分离相同类型的值

vstephenmsft_1-1732585258661.png

2. 将字段更改为正确的数据类型:

vstephenmsft_2-1732585273431.png

3. 删除与属性中的分组行相对应的"合计"值,因为列字段可以在 PowerBI Desktop 中自动聚合,可以得到:

vstephenmsft_3-1732585637922.png

函数:“Text.Contains”

vstephenmsft_4-1732585650141.png

其功能是 检测文本文本是否包含文本子字符串。如果找到文本,则返回 真。上述公式表示删除包含“TOTAL”的行。

4. 使用“添加条件列”创建一个新列来分隔属性字段

vstephenmsft_5-1732585672556.png

vstephenmsft_6-1732585692739.png

5. 获取第一列我们需要的结果的属性分组,并使用向下填充函数填充同一组下的行值。最后删除原始表中的相应行,可以得到如下:

vstephenmsft_7-1732585709143.png

函数:“Table.FillUp”

vstephenmsft_8-1732585721734.png

它的功能是从指定的表中返回一个表,其中下一个单元格的值传播到指定列中的上方null值单元格。使用上述公式中的选定字段填充空白行。

6. 相同的操作逻辑,找出结果图中第二列字段的分组,使用“添加条件列”创建新列:

vstephenmsft_9-1732585750642.png

7. 使用“填充”功能并删除原始表格中的相应行,您将看到如下:

vstephenmsft_10-1732585765808.pngvstephenmsft_11-1732585771943.png

8. 至此,我们基本获得了理想的结果。如果我们以后需要过滤或计算 “销售部门” 字段,我们可以使用 “Extract” 函数来过滤掉该值的数字部分。将文本类型转换为数字类型,您将看到如下:

vstephenmsft_12-1732585784317.pngvstephenmsft_13-1732585789587.png

函数:“Table.TransformColumns

vstephenmsft_14-1732585801410.png

其功能是通过对参数 transformOperations 中指定的列应用转换操作,从输入表中返回一个表。如果该列不存在,则除非可选参数 defaultTransformation 指定了替代项,否则将引发异常。保留上述公式中每行文本中的最后三个值。

 

9. 最后,我们成功获得了一个满足 PowerBI Desktop 中可视化运算和计算的表模型。您将看到如下:

vstephenmsft_15-1732585814350.png

通过以上步骤,我们可以在 Power Query 中对导入的不规则数据模型进行一系列修改,最终构建一个数据模型,用于后续在 PowerBI Desktop 上的可视化操作或计算。希望这篇文章能帮助到这里有类似问题的每个人。

 

相关操作的代码如下:

 

 

let 

    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMjE2AAJDBV2Fp61rnvbvUDBU0lFSitWJVnq2aaeCqYGBwrP1q5/2tgNFDYEK4TLmpkgyRjCZkPySxByFl1Mank5Z97J5xcvpKxSAhgNVGCPrBRmE0GyKy1RTfIYa4XWQMZIEih+MkCSMTFE9h9syY6ACM5gC/xBHHwVYsCEFmglMBUTOCBGkRjiDFOgE7M4xxuccE1DgmOLwoSHOgDbCZ6YpsqVIXkTzhgXI2lgA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [描述 = _t, 值 = _t]), 

    #"Changed Type" = Table.TransformColumnTypes(Source,{{"值", Int64.Type}, {"描述", type text}}), 

    #"Filtered Rows" = Table.SelectRows(#"Changed Type", each not Text.Contains([描述], "TOTAL")), 

    #"Added Conditional Column" = Table.AddColumn(#"Filtered Rows", "客户", each if Text.Contains([描述], "公司") then [描述] else null), 

    #"Filled Down" = Table.FillDown(#"Added Conditional Column",{"客户"}), 

    #"Filtered Rows2" = Table.SelectRows(#"Filled Down", each not Text.Contains([描述], "4300001 - 公司 1")), 

    #"Filtered Rows3" = Table.SelectRows(#"Filtered Rows2", each not Text.Contains([描述], "4300002 - 公司 2")), 

    #"Added Conditional Column1" = Table.AddColumn(#"Filtered Rows3", "销售部门", each if Text.Contains([描述], "销售部门") then [描述] else null), 

    #"Filled Up" = Table.FillUp(#"Added Conditional Column1",{"销售部门"}), 

    #"Filtered Rows1" = Table.SelectRows(#"Filled Up", each not Text.Contains([描述], "销售部门")), 

    #"Extracted Last Characters" = Table.TransformColumns(#"Filtered Rows1", {{"销售部门", each Text.End(_, 3), type text}}), 

    #"Reordered Columns" = Table.ReorderColumns(#"Extracted Last Characters",{"描述", "客户", "销售部门", "值"}) 

in 

    #"Reordered Columns" 

 

 

 

原作者:Henry Kong

审核: Ula Huang, Kerry Wang

翻译:Tianyi Chang