在Power BI中清理表

时间:2018-04-30 19:36:06

标签: powerbi dax powerquery m

我正在尝试将多个Excel文件加载到Power BI中。这些文件非常小(< = ~1k行)。必须清理其中一个来源。特别是,其中一列有一些不良数据。正确的数据存储在另一个Excel文件中。例如:

table bad:
ID    col1
1     0
2     0.5
3     2
4     -3

table correct:
ID    colx
2     1
4     5

desired output:
ID    col1
1     0
2     1
3     2
4     5

在SQL或其他数据可视化工具中,我会将坏表连接到干净表,然后合并坏值和更正值。我知道我有一些关于如何在Power BI中实现它的选项。我认为一种选择是在查询编辑器中实现它(即M)。我认为另一种选择是在数据模型(即DAX)中实现它。哪个选项最好?并且,实现会是什么样的(例如,如果M,那么查询是什么样的)?

1 个答案:

答案 0 :(得分:1)

虽然您可以在DAX中执行此操作,但我建议您在查询编辑器中执行此操作。步骤看起来大致如下:

  1. 使用ID Correct上的左外连接将Bad表合并到columns表中。
  2. Merge Tables

    1. 展开Correct表格以获取Colx列。
    2. Expand Column

      1. 创建自定义列以选择所需的值。 (添加列>自定义列)

        if [Colx] = null then [Col1] else [Colx]

      2. Custom Column

        1. 如果您愿意,可以删除Col1Colx列。如果您删除Col1,则可以将Col2列重命名为Col1
        2. 如果您不希望源表浮动,您可以在类似于此的单个查询中执行上述所有操作:

          let
              BadSource = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUTJQitWJVjICsfRMwWxjINsIzDIBsnSNlWJjAQ==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, Col1 = _t]),
              CorrectSource = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlLSUTJUitWJVjIBskyVYmMB", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, Colx = _t]),
              Bad = Table.TransformColumnTypes(BadSource,{{"ID", Int64.Type}, {"Col1", type number}}),
              Correct = Table.TransformColumnTypes(CorrectSource,{{"ID", Int64.Type}, {"Colx", type number}}),
              #"Merged Queries" = Table.NestedJoin(Bad,{"ID"},Correct,{"ID"},"Correct",JoinKind.LeftOuter),
              #"Expanded Correct" = Table.ExpandTableColumn(#"Merged Queries", "Correct", {"Colx"}, {"Colx"}),
              #"Added Custom" = Table.AddColumn(#"Expanded Correct", "Col2", each if [Colx] = null then [Col1] else [Colx]),
              #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Col1", "Colx"}),
              #"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"Col2", "Col1"}})
          in
              #"Renamed Columns"