Power Query / Power BI 从另一个 excel 工作簿中查找数据

Power Query / Power BI get look for data from another excel workbook

我正在尝试将来自两个不同工作簿的工作sheet与 Power Query 合并,但我很难做到。

我不想合并这两个工作簿。

我不想建立关系或 "joints"。

但是,我想获取只有一列的工作簿的非常具体的信息。 "ID" 列。

ID 列的行带有字母标记:AB 或 BE。 在这些字母之后,特定的数字范围是相关联的。 对于 AB 和 BE,数字范围首先从 0000 到 3000,然后从 3000 到 6000。

因此我有以下几种可能: 从 AB0000 到 AB3000 从 AB3001 到 AB6000 从 BE0000 到 BE3000 从 BE3001 到 AB6000

每个类别都与其他工作簿中我的地理列中的特定项目相匹配: 从AB0000到AB3000,就是ItalyZ 从AB3001到AB6000,就是意大利B 从BE0000到BE3000,是UKY 从BE3001到AB6000是UKM

因此,我试图找到与第一个 AB 类别、第二个 AB 类别、第一个 BE 类别和第二个相关的最高数字。

然后我想在另一个查询中 "bring" 这个数字,并在每次在另一个工作簿中找到匹配的国家/地区时递增它。 例如:

AB356 是第一个工作簿中的最高数字。

找到第一个 "ItalyB" 后,旁边的列将写入 "AB357"。 找到第二个 "ItalyB" 后,在旁边的列中写入 "AB358".

这是单栏作品sheet:

这是另一篇sheet关于不同国家地理的作品:

这是一个结果示例:

有一栏(地理) 我认为这是我应该努力的方向:

我添加了索引列,以 1 开头,因为每一行(即使是零行)都应该增加四个匹配代码中的任何一个。

为了继续前进,我也一直在尝试在第三个 excel sheet 中创建某种映射,我在 Power BI 中导入了它,但我不确定这是不是一个好的前进方向:

创建空白查询时得到以下结果:

更正后,我在创建空白查询时仍然得到这个结果:

这不是一个简单的答案,因为要获得结果需要很多步骤。由于复杂性,我选择了 m-query。

在 PBi 中点击 Transform data,现在你在 m-query 中。

  1. 带ID的table(我叫它"HighestID")需要扩展 因为我们需要能够映射前缀
  2. 你需要一个映射table ("GeoMapping"),否则前缀与 地理位置。
  3. 我们需要 Geo-table 上的新 ID(我称之为 "Geo")。

展开HighestID table.

点击 table 并打开高级编辑器,查看您的代码并将其与下面的代码进行比较,最后两个步骤是必不可少的,我在其中添加了两列(前缀和编号)以后需要。

let
    Source = Csv.Document(File.Contents("...\HighestID.csv"),[Delimiter=";", Columns=1, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    #"Changed Type1" = Table.TransformColumnTypes(#"Promoted Headers",{{"ID", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type1", "Prefix", each Text.Middle([ID],0,2), type text),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "Number", each Number.FromText(Text.Middle([ID],2,5)))
in
    #"Added Custom1"

结果:

创建映射table

单击您最后一个 table 下方的右键,然后单击空白查询:

粘贴下面的源代码,确保合并 table 的名称与您的 table 的名称相同。正如我提到的,我将其称为 HighestID。

let
    Source = #table({"Prefix", "Seq_Start", "Seq_End","GeoLocation"},{{"AB",0,2999,"ItalyZ"},{"AB",3000,6000,"ItalyB"},{"BC",0,299,"UKY"},{"BC",3000,6000,"UKM"}}),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Seq_Start", Int64.Type}, {"Seq_End", Int64.Type}}),
    #"Merged Queries" = Table.NestedJoin(#"Changed Type", {"Prefix"}, HighestID, {"Prefix"}, "HighestID", JoinKind.LeftOuter),
    #"Expanded HighestID" = Table.ExpandTableColumn(#"Merged Queries", "HighestID", {"Number"}, {"Number"}),
    #"Filtered Rows" = Table.SelectRows(#"Expanded HighestID", each [Number] >= [Seq_Start] and [Number] <= [Seq_End]),
    #"Grouped Rows" = Table.Group(#"Filtered Rows", {"Prefix", "Seq_Start", "Seq_End", "GeoLocation"}, {{"NextSeq", each List.Max([Number]) + 1, type number}})
in
    #"Grouped Rows"

结果:

添加 NextSeq 列

这是困难的一点,因为当我只给你代码时,恐怕它不会工作,所以我给你你需要做的步骤。

1.Select table,右键单击地理并单击分组依据。 select 如下:

  1. 与 table 地理映射合并,如下所示:

  2. 使用 NextSeq 扩展 GeoMapping

  3. 添加自定义列:

  4. 删除不需要的列,因此只保留在步骤 4 中创建的自定义。

  5. 展开列(全部select)。最终结果是您之前拥有的所有列加上一个索引列。