ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1825|回复: 13

[求助] power query table.select优化求助(已上传需优化的报表)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-5-30 21:57 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 cidaooo 于 2020-6-1 13:39 编辑

各位大大们,我是刚学习power query的菜鸟。工作上有一张表需要用到lookup公式匹配另一个表里面的数据并返回另一个表中对应的一列,但是条件很多,跑一次很慢,而且每月都要重跑。我想写入power query里降低操作量,提高速度。excel代码如下:
=IF(AV2="","",
            LOOKUP(1,0/(
                                   ('Project'!$AA:$AA=AV2)                                
                                  *('Project'!$K:$K<=ROUNDDOWN(Q2,0))        
                                  *('Project'!$L:$L>=ROUNDDOWN(Q2,0))      
                                  *('Project'!$R:$R<=AA2)                                
                                  *('Project'!$S:$S>=AA2)                        
                                  *('Project'!$T:$T<=AB2)
                                  *('Project'!$U:$U>=AB2)
                                  *('Project'!$I:$I>=ROUND(AE2,4)
                                  )
                           ),
                 'Project'!$A:$A)
         )


然后我自己摸索写了一个query的代码如下,但是加载时候非常的慢。请问各位大神是不是思路有问题,或者该如何优化,谢谢!!
PS. project是匹配表, 返回[序号]列的数据到方案核对表中。

let
    源 = Excel.Workbook(File.Contents("方案核对.xlsx"), null, true),
    project=Excel.Workbook(File.Contents("project.xlsx"), null, true),
    方案核对_Table = 源{[Item="方案核对",Kind="Table"]}[Data],
    缓存project=Table.Buffer(project),
    已添加自定义 = Table.AddColumn( 方案核对_Table, "自定义", each
                                                    Table.SelectRows(缓存project,(x)=>
                                                    x[索引码]=[索引码]
                                                and x[开始日期] <=[申请提交日期]
                                                and x[结束日期] >=[申请提交日期]
                                                and x[首付下限] <=[首付比例]
                                                and x[首付上限] >=[首付比例]
                                                and x[尾款下限] <=[尾款比例]
                                                and x[尾款上限] >=[尾款比例]
                                                and x[SVW贴息比例金额]>=[整车厂贴息比例])[序号]),
    #"展开的“自定义”" = Table.ExpandListColumn(已添加自定义, "自定义")
in
    #"展开的“自定义”"

已上传模板,求大神帮助!感谢!


求助模板.rar

1.2 MB, 下载次数: 7

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-1 12:37 | 显示全部楼层
有没有大神可以帮忙提供个思路呀

TA的精华主题

TA的得分主题

发表于 2020-6-1 12:52 | 显示全部楼层
没有数据,那只是一堆乱码

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-1 13:15 | 显示全部楼层
deadzlq 发表于 2020-6-1 12:52
没有数据,那只是一堆乱码

其实就是table.selectrows这个公式有没有优化的办法。。数据量大的时候太慢了。。像excel里lookup这种很慢可以借用数组+字典解决。query里有类似的办法吗

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-1 13:39 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
deadzlq 发表于 2020-6-1 12:52
没有数据,那只是一堆乱码

大神好,已上传了数据模板

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-2 09:46 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-6-2 10:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
先按索引码合并查询,相当于按索引码筛一遍,再对每个单元格里带过来的表用table.select筛选,计算量会少很多.

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-2 11:12 | 显示全部楼层
libo5563 发表于 2020-6-2 10:08
先按索引码合并查询,相当于按索引码筛一遍,再对每个单元格里带过来的表用table.select筛选,计算量会少很多.

索引码合并查询,然后把需要project表中对应的列展开,然后再添加条件列直接用if then引用表内数据。这个办法我试过,确实快很多,但是问题在于展开时候会产生很多重复列(因为索引码不是一对一是多对多),然后需要在最终返回结果后再清晰掉重复列。问题在于不能单纯的删除空/错误值,因为本身就可能有匹配不上的。我需要在保持初始表格完成且不重复的情况下按1、重复行有返回正确结果的则删除空值对应的重复行,2、重复行均返回空的则删除一个空的,3、不重复且返回空的不删除。这三个条件进行筛选我没想出100%不会出错的办法。。

TA的精华主题

TA的得分主题

发表于 2020-6-2 11:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 deadzlq 于 2020-6-2 14:59 编辑

PowerQuery参考优化写法
QQ截图20200602145858.png

方案核对表.rar

851.98 KB, 下载次数: 6

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-2 13:20 | 显示全部楼层
本帖最后由 cidaooo 于 2020-6-2 13:22 编辑
deadzlq 发表于 2020-6-2 11:23
PowerQuery参考优化写法

大佬,这个写法是有问题的。这个就是我楼上说的索引码合并查询然后在合并后的表内进行筛选,这样确实可以大幅提高速度。但是清单表左侧记录码是唯一且连续的。合并的时候会新增很多重复行,因为索引码不是一对一是多对多。之后匹配完后,就要按一下三个逻辑进行去重,但是去重逻辑的代码我没想出怎么写。您的这个结果上就出现了许多重复记录号的行。

去重逻辑:
1、记录号出现重复的,保留对应proj.序号不为错误/空的行。
2、记录号出现重复的,如果对应的proj.序号都为空/错误,则删除掉重复的,保留一行。
3、记录号没出现重复的,无论proj.序号是否为空/错误,均保留。

最终得到的结果应该是与清单一样连续且不重复的记录号,且保留了所有能匹配上proj.序号的行,删除了重复+序号空的行,没有匹配上的就留空或报错。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-15 12:22 , Processed in 0.041079 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表