飞天篮球

边齐
第 3 位会员
注册于 2018-08-08 14:57:03
活跃于 2020-04-01 16:24:24


  • 城市
  • 求 Power Query 转换步骤 at 2018-11-30 08:49:18

    @choicechoi 多练练。学点M,施阳的微博,曾、朱老师的课,畅神的M群,都是极好的。

  • 求 Power Query 转换步骤 at 2018-11-29 22:47:55

    补充两点,供参考:

    1、上述”合并列“这一步中的each List.Product(_)可以简化写成List.Product

    2、上述”逆透视“和”合并列“这两步可以用以下步骤代替,不过削微长了一点,没有Unpivot来的直接。

    变 = Table.FromRecords(
                           List.TransformMany( {"红灯标记","黄灯标记","绿灯标记"},
                                               (a)=>Table.TransformRows( 源, 
                                                                        each [ 业务类型=[业务类型],
                                                                               分公司_1=[分公司_1],
                                                                               标记=a,
                                                                               值=Record.Field(_,a)*[计数] ] ),
                                               (x,y)=>y )
                         )
    
  • 求 Power Query 转换步骤 at 2018-11-29 21:17:47

    fyi..没有文件,凭空想的,看看是不是你要的结果。窗口操作就可以完成。

    let
        源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    
        //选中红黄绿标记的3列,点击“逆透视”--“仅逆透视选中列”
        逆透视 = Table.Unpivot(源, {"红灯标记", "黄灯标记", "绿灯标记"}, "属性", "值"),    
    
       //选中“计数”和“值”这两列,点击“合并列”,然后修改编辑栏的公式变成以下
        合并列 = Table.CombineColumns(逆透视, {"计数", "值"},each List.Product(_),"已合并"),
    
       //选中"分公司_1"这一列,点击“透视列”,对话框中“值列”选“已合并”,高级选项中聚合函数选“求和”
        透视列 = Table.Pivot(合并列, List.Distinct(合并列[分公司_1]), "分公司_1", "已合并", List.Sum)
    in
        透视列
  • 表格转换 at 2018-11-29 12:11:08

    用Power Query解,供参考...

    1、首列中的每个日期如果是标准的日期格式,那"变形"这一步最后的

    (x,y)=>Number.From(not (try Date.From(y))[HasError]) 可以改为

    (x,y)=>Number.From(y is datetime)

    2、最后一步“输出”的作用是把3列日期转换为日期格式,避免加载到表的时候日期变成数字。
    这一步可以省略,等加载到表后,把那3列日期设置单元格格式为日期格式。

    let
        源   = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    
        变形 = Table.Combine( 
                            Table.Group( 源, 
                                         "商品编号",
                                         { "a", each #table( {"录入日期","录入单号","门店","仓位"}
                                                              &
                                                              Table.ColumnNames(源),
    
                                                              List.Transform( List.Skip(Table.ToRows(_),4),  
                                                                              (z)=>List.FirstN([商品编号],4)&z) ) },
                                         0,
                                         (x,y)=>Number.From(not (try Date.From(y))[HasError]) ) [a]
                           ),
    
        输出 = Table.TransformColumns( 变形,
                                       List.Transform( {"录入日期","生产日期","到期日期"},
                                                        each {_,Date.From} ) 
                                     )
    
    in
    
        输出
  • 如何跨表,多行,文本匹配 at 2018-11-28 16:58:35

    fyi...

    也可以在PBID中试试Table.FuzzyNestedJoin这个函数。

    把那两张表分别命名为表1,表2,通过Excel导入该工作簿:

    let
        源 = Excel.Workbook(File.Contents("\\Mac\Home\Desktop\11.xlsx"), null, true),
    
        fuzzyNestedJoin = Table.FuzzyNestedJoin( 源{[Name="表1"]}[Data],"PartNo",
                                                 源{[Name="表2"]}[Data],"规格",
                                                 "a",
                                                  1,
                                                 [ IgnoreCase=true,
                                                   IgnoreSpace=true,
                                                   Threshold=0 ] ),
    
        expnd = Table.ExpandTableColumn( fuzzyNestedJoin, "a", {"品号"} )
    in
        expnd

    file

  • 如何求去最高和最低后的平均分 at 2018-11-24 17:11:31

    fyi

    = Table.AddColumn(源,"去最高最低后平均分",each List.Average(List.Skip(List.MaxN(Record.ToList(_),6))))
  • 表格 “” 数字 “” 列尝试将单元格数字拆分为单个数字 求和 at 2018-11-20 14:48:57

    @RICH

    法2中:
    Number.ToText([数字],Text.Repeat("+0",11))
    这部分你把它拆开来就知道怎么回事了,比如,Number.ToText(123,"+0+0+0") 结果就是数字123变成了+1+2+3,如果后边格式中的+0的个数比数字位数要多,就会在前边用+0补足。Text.Repeat("+0",11)就是重复11次“+0”。这里取值11次,是因为数字超过11位就变成科学计数了,再相加就没啥意义了,所以取了个临界值。最外层Expression.Evaluate的作用是对表达式返回计算结果。关于Expression.Evaluate,可参考施阳的文章:https://pqfans.com/1232.html

    法3叫递归,我也是写着玩的。fx=(x,y)=>if x<10 then x+y else @fx(商,余数相加), 意思就是把数字除以10,得到的商再除以10,只要商大于等于10就不停地把商除以10,直到商小于10了就跳出循环,然后每一次所得的余数就是各个位置上的数字,相加就得到结果了。关于递归,可以参考施阳的文章:https://pqfans.com/2196.html

    Abv fyi.

  • 表格 “” 数字 “” 列尝试将单元格数字拆分为单个数字 求和 at 2018-11-19 21:29:14

    出错原因施阳大神已经分析了,以下语句供参考:

    Solution 1:

    = Table.AddColumn(源,"合计",each List.Sum(List.Transform(Text.ToList(Text.From([数字])),Number.From)))

    Solution 2:

    = Table.AddColumn(源,"合计",each Expression.Evaluate(Number.ToText([数字],Text.Repeat("+0",11))))

    Solution 3:

    = let fx=(x,y)=>if x<10 then x+y 
                   else @fx(Number.IntegerDivide(x,10),Number.Mod(x,10)+y) 
       in fx(123456789,0)
  • PQ 能在一个表中指明要添加的列名和简单的四则运算公式自动运算不? at 2018-11-17 14:33:08

    fyi...

    let
        毛利表 = Excel.CurrentWorkbook(){[Name="毛利表"]}[Content],
    
        费用表 = Excel.CurrentWorkbook(){[Name="费用表"]}[Content],
    
        结果表 = Table.FromRecords(
                                  Table.TransformRows( 费用表, each _ 
                                                                   &
                                                                   [ 费用 = [管理费用]+[销售费用],
                                                                     税前利润 = 毛利表{[月份=[月份]]}[毛利]-费用 ] )
                                  )
    in
        结果表

    file

  • 如何将表中的一列转换成多列? at 2018-11-13 11:52:00

    fyi...

    let
        源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    
        变 = Table.Combine(
                           Table.ToList(源,each [ a = List.Transform(Text.Split(_{2},"#(lf)"),(x)=>Text.Start(x,2)),
                                                  b = List.Count(a),
                                                  c = List.Repeat({Number.From(Text.Select(_{1},{"0".."9","."}))/b},b),
                                                  d = #table({"运单号"}&a,{{_{0}}&c}) ] [d] )
                          ),
    
        结 =  let t=Table.ColumnNames(变)
              in  变 & 
                      #table( t,
                                { {"合计"}
                                  & 
                                  List.Transform( List.Skip(t),
                                                  each List.Sum( Table.Column(变,_) )
                                                 ) } )
    in
        结

    file

  • 如何把字段数量不固定的数据段,转换为整齐的透视列? at 2018-11-08 08:40:42

    @史努比

    fyi...新建一个空白查询,点高级编辑器,清空,然后复制粘贴以下内容,看一下运行结果是不是你想要的动态扩展列。

    let
    
        // 模拟一个带有tablecolumn的数据源表
    
        src   = #table( {"seq","tbl"}, { {1,#table(1,{{1}})},
                                         {2,#table(2,{{1..2}})},
                                         {3,#table(3,{{1..3}})},
                                         {4,#table(4,{{1..4}})},
                                         {5,#table(5,{{1..5}})} } ),    
    
        // List.Union这部分表示动态最大列数
    
        expnd = Table.ExpandTableColumn( src, 
                                         "tbl", 
                                         List.Union(
                                                    List.Transform(src[tbl],Table.ColumnNames)   
                                                    ) 
                                        )                               
    
    in
        expnd
  • 信息被删除或无权限查看
  • 自定义函数调取报错 at 2018-11-07 10:37:19

    @Bin 这个我不会。希望有其他朋友帮忙回答。

  • 自定义函数调取报错 at 2018-11-07 09:32:24

    自定义函数中的"请修改"不是工作表名称,而是某个普通数据区域按ctrl+t之后形成的表格名称。对应到本例,可以先把请修改这个sheet中的数据区ctrl+t转换为表格,左上角处修改名称为"请修改",就可以正常运行了。当然,表格名称可以任意命名,并在自定义函数中作相应更改即可。fyi!

  • 请教一下怎么恢复前面步骤的筛选,不影响后面步骤的结果? at 2018-11-06 11:01:53

    要实现的结果是啥样的?是这样吗?

    = Table.TransformColumns(步骤名称,{"处理列的列名",each if _<>null and Text.Contains(_,"银行") then "1"&_ else _})