仿制Sumproduct()

M语言虽然函数众多,但是没有一个函数能够像Excel函数Sumproduct()起到对应项相乘然后加总的作用。幸运的是,M语言函数经过适当的搭配可以模仿Sumproduct(),以下是其中一种可行的组合:

( Cols as list ) as number ⇒
    let
        Zipping = List.Zip( Cols ),
        Multiplication=
            List.Transform(
                Zipping,
                each List.Product( _ )
            ),
        Outcome = List.Sum( Multiplication )
    in
        Outcome

在构造这个自定义函数时,首先要想到List.Product()只接受串列作为它的自变量,明白这点后就很容易想到每一组对应项需要构造成只有两个元素的串列,这个步骤需要使用List.Zip()完成。List.Zip()构造的含有两个元素的串列组是需要进行历遍相乘,所以需要List.Transform()与List.Product()搭配完成这个动作。最后,通过List.Sum()把完成相乘后的串列组进行相加就可以达到仿制Sumproduct()的效果。

为了测试这个自定义函数,构造了如下表格:

let
    Source=
        Table.Group(
            Database,
            "Product",
            {
                "SalesAmount",
                each fnSumproduct( { [Price], [Quantity] } ),
                Int64.Type
            }
        )
in
    Source

使用以上代码,得到如下汇总:

附件

3 Replies to “仿制Sumproduct()”

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注