题目:
现有用料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 余料
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
没老师写的简洁
如果库存不够的时候,可以取正吗,比如库存100, 需求150, 取正50