PQ 问题,求解答

Power Query choicechoi ⋅ 于 2019-11-20 21:18:38 ⋅ 最后回复由 土豆先森 2020-04-08 13:00:48 ⋅ 2263 阅读

file

成为第一个点赞的人吧 :bowtie:
最佳答案
  • 焦棚子 微软 MVP
    2019-11-21 09:47:29

    file
    参考

    let
        源 = Excel.CurrentWorkbook(){[Name="demo"]}[Content],
        类型 = Table.TransformColumnTypes(源,{{"销售经理", type text}, {"销售日期", type date}, {"销售金额", Int64.Type}}),
        by = Table.AddColumn(类型, "by", each Number.From([销售日期]),Int64.Type),
        解 = Table.Group(by
                            , {"销售经理"}
                            , {
                                "达标日期"
                                , (T)=> 
                                    let 
                                        R=Table.SelectRows(
                                                            Table.AddColumn(T
                                                                            ,"LJ"
                                                                            ,each List.Sum(List.FirstN(T[销售金额],[by]-List.Min(T[by])+1) ) )
                                                            ,each [LJ]>=10) 
                                    in 
                                    Table.SelectRows(R,each [LJ]=List.Min(R[LJ]))[销售日期]{0}? 
                            ,type date
                                }
                            ),
        筛选 = Table.SelectRows(解, each ([达标日期] <> null))
    in
        筛选
回复数量: 10
  • 焦棚子 微软 MVP
    2019-11-21 09:47:29

    file
    参考

    let
        源 = Excel.CurrentWorkbook(){[Name="demo"]}[Content],
        类型 = Table.TransformColumnTypes(源,{{"销售经理", type text}, {"销售日期", type date}, {"销售金额", Int64.Type}}),
        by = Table.AddColumn(类型, "by", each Number.From([销售日期]),Int64.Type),
        解 = Table.Group(by
                            , {"销售经理"}
                            , {
                                "达标日期"
                                , (T)=> 
                                    let 
                                        R=Table.SelectRows(
                                                            Table.AddColumn(T
                                                                            ,"LJ"
                                                                            ,each List.Sum(List.FirstN(T[销售金额],[by]-List.Min(T[by])+1) ) )
                                                            ,each [LJ]>=10) 
                                    in 
                                    Table.SelectRows(R,each [LJ]=List.Min(R[LJ]))[销售日期]{0}? 
                            ,type date
                                }
                            ),
        筛选 = Table.SelectRows(解, each ([达标日期] <> null))
    in
        筛选
  • 飞天篮球 Talk is cheap, show me your code.
    2019-11-21 10:29:12

    fyi

    = let fx=(x,y,z)=>if List.Sum(y)<10 then [] else 
                      if List.Sum(List.FirstN(y,z))>=10 then x{z-1}
                      else @fx(x,y,z+1) 
       in Table.Group(源,"销售经理",{"达标日期",each fx(_,[销售金额],1)[销售日期]?},1)

    file

  • 焦棚子 微软 MVP
    2019-11-21 11:18:11

    @飞天篮球
    acc老师,这个递归有点妙用,但缺个容错机制,若数据源中并没有严格按照顺序来记录数据就会出错。

    如:

    file

    acc老师辛苦优化下哇,再学习acc之神的战法。

  • 飞天篮球 Talk is cheap, show me your code.
    2019-11-21 11:27:45

    @焦棚子
    这样的话,前面都不变,group里边多写一步排序,比如:
    .........Table.Group(源,"销售经理",{"达标日期",each [a=Table.Sort(_,"销售日期"),b=fx(a,a[销售金额],1)[销售日期]?][b]},1)
    看看行不行?

  • choicechoi 想成为一名数据分析师,可只懂皮毛
    2019-11-21 17:16:14

    谢谢两位老师的帮忙,感谢!

  • choicechoi 想成为一名数据分析师,可只懂皮毛
    2019-11-21 22:40:34

    @焦棚子 老师您好,我发现您的代码,如果同一天一个销售经理有多条记录,会取不到当天为达标日期
    譬如,A 在1月2号有多条记录,之和大于10

    file销售经理 销售日期 销售金额
    A 2019/1/2 3
    B 2019/1/3 5
    C 2019/1/4 6
    D 2019/1/5 7
    A 2019/1/3 9
    B 2019/1/4 3
    D 2019/1/6 4
    C 2019/1/9 2
    A 2019/1/9 4
    D 2019/1/10 3
    B 2019/1/2 4
    E 2019/1/6 11
    T 2019/1/1 10
    K 2019/1/7 9
    K 2019/1/15 1
    A 2019/1/2 8

  • choicechoi 想成为一名数据分析师,可只懂皮毛
    2019-11-21 22:48:16

    @焦棚子 其实我再group by日期 sum一下也可以解决此问题...

  • Nikolas
    2020-03-23 21:48:20

    let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    自定义1 = Table.Group(源,"销售经理",{">10的日期",each
    try Table.SelectRows(
    Table.Buffer(
    Table.Sort(
    let a=Table.AddIndexColumn(_,"索引",0) in
    Table.AddColumn(a,"L",each
    List.Sum(
    Table.SelectRows(a,(t)=> t[索引]<=[索引])[金额])
    ),
    {{"销售日期",0}})),
    each [L]>=10){0}[销售日期] otherwise "无"
    }),
    筛选的行 = Table.SelectRows(自定义1, each [#">10的日期"] <> "无"),
    更改的类型 = Table.TransformColumnTypes(筛选的行,{{">10的日期", type date}})
    in
    更改的类型

  • choicechoi 想成为一名数据分析师,可只懂皮毛
    2020-04-04 11:16:39

    @Nikolas 如果用power pivot 可以怎样实现吗? 我用pp发现达标时间作为度量值并不能按达标时间来排序,谢谢!

  • 土豆先森 Excelfocus
    2020-04-08 13:00:48

    如果是写了Sort类函数的时候最好在函数的前面再上Buffer函数,这样速度稍微就可以快些~

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