ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何利用PQ整理不规范的源表?

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-16 14:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

各位都是高手啊!

TA的精华主题

TA的得分主题

发表于 2020-12-16 14:14 | 显示全部楼层
我上面那个忘记把车间搞出来了, 自定义函数要加一个参数, 把s{1}取出就可以

TA的精华主题

TA的得分主题

发表于 2020-12-16 14:16 | 显示全部楼层
  1. let
  2.     Source = Excel.Workbook(File.Contents(file), null, true){[Item="源表",Kind="Sheet"]}[Data],
  3.     fx = (subTbl)=> let lists=List.Split(List.Alternate(List.Skip(Table.ToColumns(subTbl)), 1, 1, 1), 4)
  4.                     in List.Transform(
  5.                             lists,
  6.                             (sub)=> Table.PromoteHeaders(
  7.                                         Table.FromColumns(
  8.                                             List.RemoveLastN(sub)&{{"日期", sub{3}{0}}}&{{"值"}&List.Skip(sub{3})}
  9.                                         )
  10.                                     )
  11.                       ),
  12.     group = Table.Group(
  13.                Source,
  14.                "Column1",
  15.                {"t", each Table.SplitColumn(Table.Combine(fx(_)), "姓名", (x)=>{[Column1]{0}, x}, {"车间", "姓名"})},
  16.                0,
  17.                (x,y)=>Byte.From(y<>null)
  18.             )[t],
  19.     result = Table.FillDown(Table.SelectRows(Table.Combine(group), each [姓名]<>null), {"日期"})
  20. in
  21.     result
复制代码
我重新换了一种分组写法

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-16 15:49 | 显示全部楼层
ziying35 发表于 2020-12-16 14:14
我上面那个忘记把车间搞出来了, 自定义函数要加一个参数, 把s{1}取出就可以

现有的还看不明白呢,跟高手们的差距不是一星半点啊.

自己是否适合继续深入学习PQ,要划一个问号了!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-16 20:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zhangmi 发表于 2020-12-14 14:26
我这个应该是最简单易懂,当然,语句啰嗦在所难免

看了本帖中的6种解决方案,像我这样的新手来说,10楼zhangmi老师的做法可读性好最好:每一个步骤相对简单,函数嵌套的层次不多.
如果能在第5步,增加一个分组函数table.group ,或许能够解决日期遗漏的缺陷(本例中日期共有4个,但此种做法中5号被4号覆盖掉了).
我功力不够,希望看到的老师能够完善一下,多谢!
20201216203340.jpg let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    a = Table.FillDown(源,{"列1"}),
    aa=Table.ToColumns(a),
    ab=List.Select(aa,each _{0}<>null),
    ac=List.Split(List.Skip(ab),4),
    ad=List.Transform(ac,each Table.FromColumns({ab{0}}&_)),
    ae=List.Transform(ad,each Table.PromoteHeaders(_)),
    af=List.Transform(ae,each Table.SelectRows(_, each [姓名]<>null and [姓名]<>"姓名")),

    逆透视的其他列 = List.Transform(af,each Table.UnpivotOtherColumns(_, {"包装车间", "姓名", "时间", "权重"}, "日期", "值")),
    合并=Table.Combine(逆透视的其他列)
in
    合并

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-16 20:49 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-16 20:57 | 显示全部楼层
zhangmi 发表于 2020-12-14 14:26
我这个应该是最简单易懂,当然,语句啰嗦在所难免

List.Split是个新函数呢,用得巧妙!

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-16 21:06 | 显示全部楼层
123-456789 发表于 2020-12-13 18:09
粗心了,你说的对,是漏掉了两行数据。问题出在A步骤中的Table.SelectRows(),删除A步骤中的这个函数就正确 ...

这一步对我来说,犹如天书一般!
研究了很长时间,还是搞不明白哇
= Table.Group(

A,"列1",{"a",(x)=>Table.Combine(

let m=Table.ToColumns(x) in List.Transform({0..List.Count(List.Skip(m))/8-1},

each let b=Table.FromColumns(List.Alternate(List.Range(List.Skip(m),_*8,8),1,1,1)) in

Table.Skip(Table.AddColumn(b,"Column5",each b[Column4]{0}))

))})

TA的精华主题

TA的得分主题

发表于 2020-12-17 09:51 | 显示全部楼层
PQ编辑器→选项和设置→查询选项→始终忽略隐私级别设置

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-12-17 10:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ziying35 发表于 2020-12-17 09:51
PQ编辑器→选项和设置→查询选项→始终忽略隐私级别设置

收到!可以再研究一下新的解决方法了.
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-15 16:32 , Processed in 0.044955 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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