避免重复电源查询

问题描述 投票:0回答:1

我正在开发一个输入表,它将在同一张表中的多行上使用相同的数据验证和依赖数据验证。 我目前至少有 4 个 Power Queries,我想知道这是否是结合使用 Power Query 和 Excel 公式的最佳方法。

我已经替换了实际数据以保护有罪者。

查询 1 和 2 使用工作簿 1 中的数据,查询 3 和 4 使用工作簿 2 中的数据。 查询 3 和 4 是一个类似的过程,但针对不同的数据,因此我将它们排除在外,并将使用从如何正确执行查询 1 和 2 中获得的信息并进行相应调整。

我知道这是一张图片,而不是发布的数据。 我将在最后查看添加的基于文本的源数据。

我的所有源信息都排列在表格中,如下所示:

Source Data

我使用内置功能区命令对上述信息执行组合电源查询,以在电源查询编辑器中生成以下内容:

Combined table

然后我继续进行一些强大的查询操作来组合列并消除多余的列

modified table

然后为了促进一级依赖下拉列表,我旋转了一列,并提出了这个作为我在工作簿中生成的最终表,我可以使用间接函数、一些串联和之前的数据验证来引用相邻单元格的列。

Pivot on column

为了获取项目列表,我基本上重复步骤 1-3,在步骤 4 中,我删除任务列并在工作簿中生成一个名为 Project_List 的表。 通过数据验证和间接,我只是做了一些类似的事情:

=indirect("Project_List")

Project List

我使用数据验证的输入表看起来像这样:

Sample Input table

Validation points

问题

因此,排序和思考过程目前有效,但我认为应该有一种更好的方法,然后重复查询以格式化您已经提取过的信息。 怎么又拉了? 有没有办法吐出一个表,退到处理列表中,然后转身吐出另一个表? 这样就只拉取一次数据?

根据我的实际数据,我认为项目编号和任务编号的组合约为 16K 行。 我认为我的第一次尝试是 270K 行,但我制作了自己的工作簿并将该信息削减到 16K 行。 我还将感兴趣的独特项目编号列表减少到大约 500 个。

可供使用的示例数据

Project No | Project Name         | Project Manager   | Office
1          | ACME                 | Wyle E. Coyote    | Arizona
2          | Hunting Season       | Bugs Bunny        | Albuquerque
3          | Earth Shatter Kaboom |Marvin The Martian | Mars

Project No | Task No | Task Name      | Note
1          | A       | Planning       | uua
1          | B       | Shipping       | ytb
1          | C       | Deployment     | ccc
2          | A       | Carrot Supply  | aah
2          | D       | Avoiding Elmer | yes
3          | B       | Planning       | kib
3          | C       | Preparation    | chh
3          | G       | Implementation | kgi
3          | T       | Detonation     | tkt

Power Query M 生成Task_List

let
    Source = Excel.Workbook(File.Contents("X:\Big Project List.xlsx"), null, true),
    Projects_Tasks_Table = Source{[Item="Projects_Tasks",Kind="Table"]}[Data],
    #"Changed Type" = Table.TransformColumnTypes(Projects_Tasks_Table,{{"Project Number", type text}, {"Project Name", type text}, {"Task Number", type text}, {"Task Name", type text}}),
    #"Removed Columns" = Table.RemoveColumns(#"Changed Type",{"Project Name"}),
    #"Added Custom" = Table.AddColumn(#"Removed Columns", "Custom", each [Task Number]&" - "&[Task Name]),
    #"Changed Type1" = Table.TransformColumnTypes(#"Added Custom",{{"Custom", type text}}),
    #"Renamed Columns" = Table.RenameColumns(#"Changed Type1",{{"Custom", "Task Np and Name"}}),
    #"Removed Columns1" = Table.RemoveColumns(#"Renamed Columns",{"Task Name"}),
    #"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Removed Columns1", {{"Project Number", type text}}, "en-CA"), List.Distinct(Table.TransformColumnTypes(#"Removed Columns1", {{"Project Number", type text}}, "en-CA")[#"Project Number"]), "Project Number", "Task Np and Name")
in
    #"Pivoted Column"

Power Query M 生成Project_List

let
    Source = Excel.Workbook(File.Contents("X:\ Big Project List.xlsx"), null, true),
    Projects_Tasks_Table = Source{[Item="Projects_Tasks",Kind="Table"]}[Data],
    #"Changed Type" = Table.TransformColumnTypes(Projects_Tasks_Table,{{"Project Number", type text}, {"Project Name", type text}, {"Task Number", type text}, {"Task Name", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each [Project Number]&" - "&[Project Name]),
    #"Reordered Columns" = Table.ReorderColumns(#"Added Custom",{"Project Number", "Project Name", "Custom", "Task Number", "Task Name"}),
    #"Renamed Columns" = Table.RenameColumns(#"Reordered Columns",{{"Custom", "Project Number and Name"}}),
    #"Removed Other Columns" = Table.SelectColumns(#"Renamed Columns",{"Project Number and Name", "Task Number", "Task Name"}),
    #"Sorted Rows" = Table.Sort(#"Removed Other Columns",{{"Project Number and Name", Order.Descending}})
in
    #"Sorted Rows"

更新

我已将所有查询设置为在关闭时删除其数据并禁止后台刷新。

excel excel-formula powerquery m
1个回答
0
投票

这里有一个使用公式和命名动态范围的快速建议:

  • 使用
    XLOOKUP
    代替
    INDIRECT
  • 没有用
    OFFSET
    省略空格,所以最后会有空格

Project_List
K3

=tbProjects[Project No] & " - " & tbProjects[Project Name]

Task_List
L3

=IFNA(DROP(REDUCE("Task List", 
tbProjects[Project No], LAMBDA(acc,cur, 
VSTACK(acc, TRANSPOSE(
FILTER(tbProjectTasks[Task No] & " - " & tbProjectTasks[Task Name], 
tbProjectTasks[Project No] = cur))))), 1), "")

Name manager

数据验证

对于

B14
-

=Project_List

对于

C14
- 选择
C14
,固定列
B
和相对行
14

=XLOOKUP($B14,Project_List,Task_List)

Data entry

© www.soinside.com 2019 - 2024. All rights reserved.