数据处理问题

Power Query 罗马假日 ⋅ 于 2019-09-05 09:01:19 ⋅ 最后回复由 klzb 2019-09-06 17:55:26 ⋅ 2120 阅读

我的数据源是这样的,
file
现在想做一个查询,把数据按如下规则处理,
1.重量如果是空白,就把空白对应的金额加到上面非空白的金额中去,然后删除重量空白行
例子:重量57.603下面一个重量是空白的,就把1725.40加到2947.63里,然后删除1725.40这一行
2.金额如果是空白,就把空白上面那个金额当总金额平均分摊到下面金额空白处,要分摊到的重量都要相加,再去除总金额,再乘以该行的重量,就是分摊到的该行的金额,这样使每行的重量都有对应的金额。
例子:金额1775下面是空的,就用1775/(16.896+1.685)得到平均系数,再乘以16.896得到这行的分摊金额,乘以1.685得到该行分摊的金额,总金额保持不变。

成为第一个点赞的人吧 :bowtie:
回复数量: 5
  • deadzlq 无我,亦无期
    2019-09-05 09:50:20

    PQ参考解法

    file

  • 罗马假日
    2019-09-05 11:44:37

    谢谢老师指点。我好好学习学习。好多表达方法不会

  • geyee
    2019-09-05 14:43:27

    如果规则2只处理仅有一个空行的话,还是可以用List.Accumulate,否则的话可能需要借助索引等辅助,走分组标记子查询的方法。

    let
        源 = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("Zc3BDcMwCAXQXThH6IMN2At0hR4s779GsFslUSv5APjr/TFIRToUqEYHvV/SHRBFLhbsKDlorzkWmsegXD9PQo0r9vEy/GtEGtCVMta25E3ED1HyN26hAlZvAa2tkHPrvgvDGI9CAUr8xdl3H815Ag==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [销售合同号 = _t, 外销发票号 = _t, 重量 = _t, #"分摊金额(含税)" = _t]),
        tlist = List.RemoveLastN(Table.ToRows(源),0),
        转换 = List.Accumulate(tlist,{},(s,c)=>if Text.Length(c{2})<=1 then List.RemoveLastN(s)&{List.RemoveLastN(List.Last(s))&{List.Sum(List.Transform({List.Last(List.Last(s)),c{3}},Number.From))} } else s&{c}),
        转换2 = List.Accumulate(转换,{},(s,c)=>if Text.Length(Text.From(c{3}))<=1 then 
                  List.RemoveLastN(s) & { List.RemoveLastN(List.Last(s)) & { Number.From( List.Last(s){2} ) / List.Sum( List.Transform({ List.Last(s){2}, c{2} }, Number.From) ) * Number.From(List.Last(s){3}) } } & {List.RemoveLastN(c)&{   Number.From(c{2}) / List.Sum(List.Transform({List.Last(s){2}, c{2} },Number.From) ) * Number.From(List.Last(s){3})} }  else s&{c}),
        result = Table.FromRows(转换2,Table.ColumnNames(源))
    in
        result

    file

  • 罗马假日
    2019-09-06 09:09:44

    不仅仅只有一行空行

  • klzb
    2019-09-06 17:55:25

    先分组,再筛选
    Table.SelectRows(Table.Combine(Table.Group(Table.FillDown(源,{"外销发票号"}),"外销发票号",{"a",each Table.FromRows(List.Transform(Table.ToRows(_),(x)=>List.RemoveLastN(x)&{x{2}*List.Sum([分摊金额])/List.Sum([重量])}),Table.ColumnNames(源))})[a]),each [分摊金额]>0)

暂无评论~~
  • 请务必阅读并严格遵守《社区管理规范与使用说明》
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 发送表情,可用的 Emoji 见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板粘贴上传, 格式限制 - jpg, png, gif
  • 不支持上传附件,请尽可能用文字和图片将问题描述清楚,如实在需要上传附件,可上传到 共享网盘 后分享链接
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
Ctrl+Enter