连续衰减问题

题目:


现有用料ABC,已知期初库存,以及连续5周每周需求的用料数,求这5周剩余的用料数。

解法:

先来捋捋思路,要求剩余用料,也就是用期初库存,减去前几周以及本周的用料。
实际上就是个累计求和,把整个表分为两部分,前2列为一部分,后5列为另一部分,那么只需要算出第二部分的累计求和,然后用[期初库存]减掉就可以了。
累计求和有很多种方法,比如list为{2,4,6,8,10},要变成{2,6,12,20,30},此时可以用List.FirstN,依次取list中的前1,2,3,4,5个元素,然后相加求和即为累计求和。
= List.Transform({1..5},each List.Sum(List.FirstN({2,4,6,8,10},_)))
有了这个思路,那我们首先要把table转为list,而转为list有Table.ToColumns,Table.ToRows,Table.ToRecords三种方式,其中第一种是按列拆分,后两种为按行拆分,我们这里显然是要按行拆分。而后两者的区别主要在于torows拆出来的list为不带字段名的单值,torecords拆出来的list为带字段名的record,本题中两个都能用,但因为还要计算所以似乎是torows更方便些。
转为list后,_{1}表示每一行中的第二列也就是[起初库存],用它来减去后面的累计求和。
而计算累计求和的时候,共有5列,所以用{1..5}来遍历,使用List.Range而没有使用上面的List.FirstN是因为还要跳过最前面的2列。
还有一个难点在于突破上下文,使用(x)=>而没有用each _就是因为上下文的关系。
所以要做本题需对table,list,record之间的相互转换及上下文关系非常熟悉才行。

let
    源 = Excel.CurrentWorkbook(){[Name="用料需求"]}[Content],
    余料 = Table.FromRows(List.Transform(Table.ToRows(源),each {_{0},_{1}}&List.Transform({1..5},(x)=>_{1}-List.Sum(List.Range(_,2,x)))),Table.ColumnNames(源))
in
    余料

附件

2 Replies to “连续衰减问题”

  1. let
    源 = Excel.CurrentWorkbook(){[Name="用料需求"]}[Content],
    已添加自定义 = Table.AddColumn(源, "bb", each Table.FromRows( {{[料号]}&[a=List.Transform(List.Skip(Record.ToList(_)),Text.From) ,
    b=List.Transform({1..List.Count(a)},(y)=>Expression.Evaluate(Text.Combine( List.FirstN(a,y),"-") ) )][b]},
    Table.ColumnNames(源)))[bb],
    自定义1 = Table.Combine(已添加自定义)
    in
    自定义1

    没老师写的简洁

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注