PowerQuery - 运行 差异列 - 有点像 运行 总计

PowerQuery - running difference columns - a bit like running totals

我有一个关节问题,我不确定描述的最佳方式。

我正在尝试在 PowerQuery /(PowerBI 的转换部分)中生成一个 运行 总数和一个 运行 差异列。

我正在按性别查看一个地区 4 个不同地点的人口数据。 因此,某个位置有性别人口和总人口。推而广之还有地区性别和地区总人口。

例如

在某个日期,我正在计算吃汉堡包的人数。 (我不是,但我试图保持它的通用性)。

这一天会有一个地点的总人口。

例如

我想为

生成列

一 运行 共 : 在那个地方吃过汉堡包的人(所以今天的价值(电视)加上昨天的价值(yv)) 在那个地方吃过汉堡包的男性 在那个地方吃过汉堡包的女性

一个 运行 的区别: 尚未在该位置吃汉堡包的人(所以昨天的位置人口(lpy)-电视) 尚未在该地点吃过汉堡包的男性 尚未在该地点吃过汉堡包的女性

有了这个定义,构建 powerquery 应该会变得更容易,这样就可以计算:

某地点have/not在特定日期吃过汉堡包的男性总人数 该地区 have/not 在某个日期

吃汉堡包的男性人数

等等,这样你就可以计算出一个地点有多少人have/have没有吃过汉堡,以及这对总地点比例和汉堡消费区域比例的贡献。

我可以在 BI 中快速生成一个快速度量来执行 运行 总计。但我遇到的问题是创建一个更复杂的 运行 总数。事实上,如果我 运行 这是正确的方式?

我有一个 table 的汇总数据,其中包含某个地区的人口分母。我想在处理过的 table 剩余人口中逐行计算,这样我就可以说“位置 1 have/have 中 x% 的男性,y% 的女性,xy% 的人吃过汉堡。

我什至不确定将 table 拆分到位置是否正确。

总结:我不知道怎么解决。

这可能会让您开始使用 Power Query。

这是一种为男性和女性生成单独 运行 总数的方法。

它是作为一个单独的函数编写的,因此也可以用于分组表。

它使用 List.Generate 功能,以及 Buffered List 速度。

fnRunningTotal

(values as list) as list =>
let 
    RT = List.Generate(
            ()=> [RT = values{0}, counter = 0],
            each [counter] < List.Count(values),
            each [RT = [RT] + values{[counter]+1}, counter = [counter]+1],
            each [RT]
    )
in 
    RT

Main MCode 编辑以缩短代码

let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{
        {"Date", type date}, {"Location", type text}, {"Gender", type text}, {"Value", Int64.Type}, {"TotalPop", Int64.Type}}),

//add custom columns to separate by Gender
    #"Added Custom" = Table.AddColumn(#"Changed Type", "maleValue", each if [Gender] = "M" then [Value] else 0),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "femaleValue", each if [Gender] = "F" then [Value] else 0),

//running totals for each Gender column
    buffMale = List.Buffer(#"Added Custom1"[maleValue]),
    buffFemale = List.Buffer(#"Added Custom1"[femaleValue]),
    RT = Table.FromColumns(
            List.Combine({Table.ToColumns(#"Added Custom1"),
                          {fnRunningTotal(buffMale), fnRunningTotal(buffFemale)}}),
            List.Combine({Table.ColumnNames(#"Added Custom1"),
                          {"runningTotalMale","runningTotalFemale"}})
        ),
    #"Removed Columns" = Table.RemoveColumns(RT,{"maleValue", "femaleValue"})    
in
    #"Removed Columns"

原创

结果