【问题标题】: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 次。

【问题讨论】:

    标签: sql-server powerbi powerquery


    【解决方案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 列)。除此之外,它工作得很好。每个序列号对应一行,该行包含所有需要的数据。
    • 对不起。我无法轻松地为不同的数据编写代码,这些数据在您的帖子中未解释的附加约束条件下看不到。如果您有其他输入和输出,则需要提供每个示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多