分配数据

Power Query xiaoni ⋅ 于 2018-09-19 11:19:13 ⋅ 最后回复由 焦棚子 2018-12-20 14:04:56 ⋅ 3313 阅读

file
请各位大神们帮忙,谢谢!

本帖已被设为精华帖!
本帖由 Alex 于 6年前 加精
最佳答案
  • 焦棚子 微软 MVP
    2018-09-20 09:31:16

    @xiaoni
    是滴,要安装py。目前支持pbi,未更新到pp。
    闲来无事,更新一个。我都感觉问题复杂化了。简单纯粹点好。

    file

    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
回复数量: 9
  • 焦棚子 微软 MVP
    2018-09-19 16:24:03

    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
        一元
  • 焦棚子 微软 MVP
    2018-09-19 23:57:53

    自定义函数的简单思路

    file

    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
        一元
  • 焦棚子 微软 MVP
    2018-09-20 09:31:16

    @xiaoni
    是滴,要安装py。目前支持pbi,未更新到pp。
    闲来无事,更新一个。我都感觉问题复杂化了。简单纯粹点好。

    file

    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
  • 焦棚子 微软 MVP
    2018-09-20 09:44:45

    @焦鹏子
    口误,
    是滴,要安装py。目前支持pbi,未更新到pp,
    更正:是滴,要安装py。目前支持pbi,未更新到excel

  • xiaoni
    2018-09-20 16:15:35

    = 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代表什么?

  • xiaoni
    2018-09-20 16:18:18

    大神们能给我解析一下上面代码List.Accumulate当第二参数用List的函义吗

  • Alex MOD 社区清洁工
    2018-09-20 16:31:33

    @xiaoni s 表示 state,是第二参数经过迭代运算的累计结果;c表示 current,是第一参数列表中当前传入的值。
    可参考 《List.Accumulate》,案例 3 和你的需求差不多。

  • 老河 Excel爱好者
    2018-12-20 10:48:26

    List.Transform(
    {0..5},(s1)=>
    qq(s0,List.Range(L0, s1, 1){0},List.Range(L1, s1, 1){0})
    )
    这个解法结果好像不对,譬如396,"10"那一列应该是0

  • 焦棚子 微软 MVP
    2018-12-20 14:04:56
    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

    file

    看得很仔细,是自定义函数没有考虑20的情况。更新下就是。
    @老河

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