请各位大神们帮忙,谢谢!
@xiaoni
是滴,要安装py。目前支持pbi,未更新到pp。
闲来无事,更新一个。我都感觉问题复杂化了。简单纯粹点好。
let
qq=let
qq=(x as number,y as number,z as number) as number=>
if z=100 then
Number.IntegerDivide(x,z)
else Number.IntegerDivide(Number.Mod(x,y),z)
in
qq,//是钱钱的意思。
Data = #table({"原数据"},{{1},{6},{17},{39},{77},{396},{1184},{50001}}),
L0={100,100,50,20,10,5},
L1={100,50,20,10,5,1},
L2={"100","50","20","10","5","1"},
Cal = Table.ExpandRecordColumn(
Table.AddColumn(
Data, "Re", (yuan)=>
Record.FromList(
List.Transform(
{yuan[原数据]},(s0)=>
List.Transform(
{0..5},(s1)=>
qq(s0,List.Range(L0, s1, 1){0},List.Range(L1, s1, 1){0})
)
){0}
,L2
)
)
,"Re", L2
)
in
Cal
List.Accumulate
的n=n+1的思路初学会比较绕。
附上一个超级简单excel的思路。前提是字段比较少可行,字段多的话,还是的用循环的List.Accumulate
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
一百 = Table.AddColumn(源, "100元", each Number.IntegerDivide([原数据],100), Int64.Type),
五十 = Table.AddColumn(一百, "50元", each Number.IntegerDivide([原数据]-[100元]*100,50) ,Int64.Type),
二十 = Table.AddColumn(五十, "20元", each Number.IntegerDivide([原数据]-[100元]*100-[50元]*50,20),Int64.Type),
十元 = Table.AddColumn(二十, "10元", each Number.IntegerDivide([原数据]-[100元]*100-[50元]*50-[20元]*20,10),Int64.Type),
五元 = Table.AddColumn(十元, "5元", each Number.IntegerDivide([原数据]-[100元]*100-[50元]*50-[20元]*10-[10元]*10,5),Int64.Type),
一元 = Table.AddColumn(五元, "1元", each [原数据]-[100元]*100-[50元]*50-[20元]*10-[10元]*10-[5元]*5,Int64.Type)
in
一元
自定义函数的简单思路
let
qq=let
qq=(x as number,y as number,z as number) as number=>
if z=100 then
Number.IntegerDivide(x,z)
else Number.IntegerDivide(Number.Mod(x,y),z)
in
qq,//qq是钱钱的意思。
Data = #table({"原数据"},{{1},{6},{17},{39},{77},{396},{1184},{50001}}),
一百 = Table.AddColumn(Data, "100元", each qq([原数据],100,100) ),
五十 = Table.AddColumn(一百, "50元", each qq([原数据],100,50) ),
二十 = Table.AddColumn(五十, "20元", each qq([原数据],50,20) ),
十元 = Table.AddColumn(二十, "10元", each qq([原数据],20,10) ),
五元 = Table.AddColumn(十元, "5元", each qq([原数据],10,5) ),
一元 = Table.AddColumn(五元, "1元", each qq([原数据],5,1) )
in
一元
@xiaoni
是滴,要安装py。目前支持pbi,未更新到pp。
闲来无事,更新一个。我都感觉问题复杂化了。简单纯粹点好。
let
qq=let
qq=(x as number,y as number,z as number) as number=>
if z=100 then
Number.IntegerDivide(x,z)
else Number.IntegerDivide(Number.Mod(x,y),z)
in
qq,//是钱钱的意思。
Data = #table({"原数据"},{{1},{6},{17},{39},{77},{396},{1184},{50001}}),
L0={100,100,50,20,10,5},
L1={100,50,20,10,5,1},
L2={"100","50","20","10","5","1"},
Cal = Table.ExpandRecordColumn(
Table.AddColumn(
Data, "Re", (yuan)=>
Record.FromList(
List.Transform(
{yuan[原数据]},(s0)=>
List.Transform(
{0..5},(s1)=>
qq(s0,List.Range(L0, s1, 1){0},List.Range(L1, s1, 1){0})
)
){0}
,L2
)
)
,"Re", L2
)
in
Cal
= Table.AddColumn(源, "a", each Record.Combine(List.Accumulate({100,50,20,10,5,1},{{},[金额]},(s,c)=>{s{0}&{Record.FromList({Number.IntegerDivide(s{1},c)},{Number.ToText(c,"0元")})},Number.Mod(s{1},c)}){0}))
List.Accumulate第三参数{s,c}s代表什么?c代表什么?
大神们能给我解析一下上面代码List.Accumulate当第二参数用List的函义吗
@xiaoni s 表示 state,是第二参数经过迭代运算的累计结果;c表示 current,是第一参数列表中当前传入的值。
可参考 《List.Accumulate》,案例 3 和你的需求差不多。
List.Transform(
{0..5},(s1)=>
qq(s0,List.Range(L0, s1, 1){0},List.Range(L1, s1, 1){0})
)
这个解法结果好像不对,譬如396,"10"那一列应该是0
let
qq=let
qq=(x as number,y as number,z as number) as number=>
if z=100 then Number.IntegerDivide(x,z)
else if z=10 then Number.IntegerDivide( Number.Mod(Number.Mod(x,50),20),z)
else Number.IntegerDivide(Number.Mod(x,y),z)
in
qq,//是钱钱的意思。
Data = #table({"原数据"},{{1},{6},{17},{39},{77},{396},{1184},{50001}}),
L0={100,100,50,20,10,5},
L1={100,50,20,10,5,1},
L2={"100","50","20","10","5","1"},
Cal = Table.ExpandRecordColumn(
Table.AddColumn(
Data, "Re", (yuan)=>
Record.FromList(
List.Transform(
{yuan[原数据]},(s0)=>
List.Transform(
{0..5},(s1)=>
qq(s0,List.Range(L0, s1, 1){0},List.Range(L1, s1, 1){0})
)
){0}
,L2
)
)
,"Re", L2
)
in
Cal
看得很仔细,是自定义函数没有考虑20的情况。更新下就是。
@老河