是否使用Power Query中的年初至今或滚动总和函数形式?

问题描述 投票:0回答:1

我对Power Query不熟悉。我有一列日期,称为MyDate,格式(dd / mm / yy)和另一个名为TotalSales的变量。有什么方法可以获取变量TotalSalesYTD,以及每行的年初至今TotalSales的总和?我已经看到您可以在Power Pivot或Power Bi上执行此操作,但是没有找到Power Query的任何内容。

或者,是否有办法为TotalSales的最后12个月的总和创建变量TotalSales12M

enter image description here

powerquery m
1个回答
0
投票

我无法正确测试,但是以下代码给了您您期望的结果:

let
    initialTable = Table.FromRows({
        {#date(2020, 5, 1), 150},
        {#date(2020, 4, 1), 20},
        {#date(2020, 3, 1), 54},
        {#date(2020, 2, 1), 84},
        {#date(2020, 1, 1), 564},
        {#date(2019, 12, 1), 54},
        {#date(2019, 11, 1), 678},
        {#date(2019, 10, 1), 885},
        {#date(2019, 9, 1), 54},
        {#date(2019, 8, 1), 98},
        {#date(2019, 7, 1), 654},
        {#date(2019, 6, 1), 45},
        {#date(2019, 5, 1), 64},
        {#date(2019, 4, 1), 68},
        {#date(2019, 3, 1), 52},
        {#date(2019, 2, 1), 549},
        {#date(2019, 1, 1), 463},
        {#date(2018, 12, 1), 65},
        {#date(2018, 11, 1), 45},
        {#date(2018, 10, 1), 68},
        {#date(2018, 9, 1), 65},
        {#date(2018, 8, 1), 564},
        {#date(2018, 7, 1), 16},
        {#date(2018, 6, 1), 469},
        {#date(2018, 5, 1), 4}
    }, type table [MyDate = date, TotalSales = Int64.Type]),

    ListCumulativeSum = (numbers as list) as list => 
        let
            accumulator = (listState as list, toAdd as nullable number) as list =>
                let
                    previousTotal = List.Last(listState, 0),
                    combined = listState & {List.Sum({previousTotal, toAdd})}
                in combined,
            accumulated = List.Accumulate(numbers, {}, accumulator)
        in accumulated,

    TableCumulativeSum = (someTable as table, columnToSum as text, newColumnName as text) as table =>
        let
            values = Table.Column(someTable, columnToSum),
            cumulative = ListCumulativeSum(values),
            columns = Table.ToColumns(someTable) & {cumulative},
            toTable = Table.FromColumns(columns, Table.ColumnNames(someTable) & {newColumnName})
        in toTable,

    yearToDateColumn = 
        let
            groupKey = Table.AddColumn(initialTable, "$groupKey", each Date.Year([MyDate]), Int64.Type),
            grouped = Table.Group(groupKey, "$groupKey", {"toCombine", each 
                let
                    sorted = Table.Sort(_, {"MyDate", Order.Ascending}),
                    cumulative = TableCumulativeSum(sorted, "TotalSales", "TotalSalesYTD")
                in cumulative
            }),
            combined = Table.Combine(grouped[toCombine]),
            removeGroupKey = Table.RemoveColumns(combined, "$groupKey")
        in removeGroupKey,
    rolling = Table.AddColumn(yearToDateColumn, "TotalSales12M", each 
        let
            inclusiveEnd = [MyDate],
            exclusiveStart = Date.AddMonths(inclusiveEnd, -12),
            filtered = Table.SelectRows(yearToDateColumn, each [MyDate] > exclusiveStart and [MyDate] <= inclusiveEnd),
            sum = List.Sum(filtered[TotalSales])
        in sum
    ),
    sortedRows = Table.Sort(rolling, {{"MyDate", Order.Descending}})
in
    sortedRows

可能有更有效的方法来执行此代码,但是如果您的数据量较小,则此方法应该可以。

  • 对于迄今为止的累计年份,将数据按年份分组,然后升序排序,然后添加运行总计列。
  • 对于连续12个月的总计,将数据分组到12个月的窗口中,然后在每个窗口中汇总销售量。总计有点效率低下(因为所有行都进行了重新处理,而与仅进入/离开窗口的行相反),但是您可能不会注意到它。
  • 在创建12个月的窗口时,可以使用
  • Table.Range代替Table.SelectRows,但我认为Table.SelectRows对输入数据的假设更少(即是否对它进行排序,是否缺少任何月份等)。因此更安全/更可靠。

这就是我得到的:

Expected result

© www.soinside.com 2019 - 2024. All rights reserved.