为 Power BI 分页报表清理数据的最佳方法是啥?

Posted

技术标签:

【中文标题】为 Power BI 分页报表清理数据的最佳方法是啥?【英文标题】:What is the best way to clean up data for a Power BI paginated report?为 Power BI 分页报表清理数据的最佳方法是什么? 【发布时间】:2021-09-23 22:06:40 【问题描述】:

我最近发现了 Power Query,但没有足够的经验来转换数据以准备需要在 Power BI 中创建的分页报表。对于每次检查,我都有三行数据。父序列号和两个子序列号。客户希望每个序列号只看到一行。如何在与父级相同的行上显示子级序列号的值。棘手的部分是测试结果有两列。一列用于数字结果,另一列用于文本结果(接受/拒绝),具体取决于检查的类型。该产品是一根绳子,两端都有配件。子序列号是父序列号,一端附加“-X”,另一端附加“-Y”。如果父序列号有检查,则子序列号将没有结果。同样,如果子序列号有检查,则父序列号不会有结果。我的想法是添加一个“X”列和一个“Y”列,并将子值显示在与父序列相同的行上。

SERIAL INSPECTION NUMERIC TEXT
SN001 INSP_A 0.01
SN001-X INSP_A
SN001-Y INSP_A
SN001 INSP_B
SN001-X INSP_B ACCEPT
SN001-Y INSP_B ACCEPT

目标

SERIAL INSPECTION NUMERIC TEXT X DATA Y DATA
SN001 INSP_A 0.01
SN001 INSP_B ACCEPT ACCEPT

X 数据和 Y 数据列应接受字母数字数据。这是第 1 步。如您所见,SN001 仍然有两行。下一步是使用下面的数据将检查转移到顶部。

SERIAL INSP_A INSP_B (X DATA) INSP_B (Y DATA)
SN001 0.01 ACCEPT ACCEPT

这可能吗?最多有 20 次检查,但幸运的是,客户只想看 8 次。

【问题讨论】:

【参考方案1】:

要进入第一步,试试这个:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCvYzMDBU0lHy9AsOiHcEMgz0wHylWB2opG4EsjSqVCROKZiEE4aeCDQpR2dn14AQbIaiKYgFAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [SERIAL = _t, INSPECTION = _t, NUMERIC = _t, TEXT = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,"SERIAL", type text, "INSPECTION", type text, "NUMERIC", type number, "TEXT", type text),
    #"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([NUMERIC] <> null or [TEXT] <> "")),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Filtered Rows", "SERIAL", Splitter.SplitTextByEachDelimiter("-", QuoteStyle.Csv, true), "SERIAL", "END"),
    #"Replaced Value" = Table.ReplaceValue(#"Split Column by Delimiter",null,"TEXT",Replacer.ReplaceValue,"END"),
    #"Pivoted Column" = Table.Pivot(#"Replaced Value", List.Distinct(#"Replaced Value"[END]), "END", "TEXT")
in
    #"Pivoted Column"

最终版本可以用于显示数据,但不能用于存储数据,但您可以像这样获得它:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WCvYzMDBU0lHy9AsOiHcEMgz0wHylWB2opG4EsjSqVCROKZiEE4aeCDQpR2dn14AQbIaiKYgFAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [SERIAL = _t, INSPECTION = _t, NUMERIC = _t, TEXT = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,"SERIAL", type text, "INSPECTION", type text, "NUMERIC", type number, "TEXT", type text),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Changed Type", "SERIAL", Splitter.SplitTextByDelimiter("-", QuoteStyle.Csv), "SERIAL", "END"),
    #"Added Custom" = Table.AddColumn(#"Split Column by Delimiter", "Combined", each if [NUMERIC] = null then [TEXT] else Number.ToText([NUMERIC]), type text),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "PivotColumn", each [INSPECTION] & (if [END] = null then "" else " (" & [END] & " DATA)"), type text),
    #"Removed Other Columns" = Table.SelectColumns(#"Added Custom1","SERIAL", "Combined", "PivotColumn"),
    #"Filtered Rows" = Table.SelectRows(#"Removed Other Columns", each ([Combined] <> "")),
    #"Pivoted Column" = Table.Pivot(#"Filtered Rows", List.Distinct(#"Filtered Rows"[PivotColumn]), "PivotColumn", "Combined")
in
    #"Pivoted Column"

要查看它们的工作原理,请将代码粘贴到高级编辑器中,然后逐步执行查询编辑器中的应用步骤,以查看每一步转换后的表。

【讨论】:

让我首先说上面的代码工作......有点。当我将它应用于我的实际数据时,每次检查都有额外的空白列。我正在寻找的是如果没有 X 或 Y 的数据,那么只显示一列用于该检查的数字或文本结果。如果有 X 和 Y 的数据,则有两列。一个用于 X,一个用于 Y。(如果可能,将它们分组在一个标题下进行检查,然后只标记 X 或 Y 列)。除此之外,它工作得很好。每个序列号对应一行,该行包含所有需要的数据。 对不起。我无法轻松地为不同的数据编写代码,这些数据在您的帖子中未解释的附加约束条件下看不到。如果您有其他输入和输出,则需要提供每个示例。

以上是关于为 Power BI 分页报表清理数据的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

power bi 如何获取数据做可视化

POWER BI 支持一个报表连接多数据集

Power BI学习

Power BI 报表服务器发布

奥威Power-BI连锁商超BI报表分析——“品牌销售分析”

在SharePoint 平台上发布一个Power BI 报表