汇总数据时如何在 Power Query / Power BI 的记录集中创建零计数行

How to create zero-count rows in recordset in Power Query / Power BI when summarizing data

我正在尝试将 Power BI 与 Power Query 结合使用,为 SSRS/Paginated 报告汇总一些数据。我想在报告中向用户显示的是一个包含列表项计数的 table。列将按名为“Office”的字段分组,行将按另一个名为“AgeGroup”的字段以及总计行分组。

我想要的 PowerBI/Power 查询是一个包含三列的记录集,“Office”、“AgeGroup”和“Count”。我现在的问题是,是否存在与给定组合匹配的零个列表项(例如,“Office”字段值为“OPQ”和“AgeGroup”字段值为“< 5 岁”的零个项目")) 那么我的结果 table 中将没有该组合(“OZR”和“< 5 岁”)的行,而我想要的是该行存在,但具有“计数”值为零。换句话说,如果“Office”有 15 个不同的值,“AgeGroup”有 3 个可能的值,我希望我的结果记录集有 45 行 (15*3 = 45)。我希望有一个公式或表达式可以用来解决我的问题。

我相信在 SSRS/Paginated 报表中使用 LookupSet 也可以做到这一点,但我认为这将是学习 Power BI / PowerQuery 新知识的好机会。

编辑: 我希望有一些图片来解释。

假设我总共有三个办公室应该显示在最终报告中(OfficeA、OfficeB 和 OfficeC)。

第一张图片:我的“数据集”:

(重要 - 请注意数据集中缺少“OfficeC”。

第二张图片:我希望作为 Power Query 的输出,在 SSRS/Paginated 报告中用作数据集:

第三张图片:我希望在分页报告中向最终用户显示的内容:

啊。

将办公室列表加载到 PowerQuery 中,并将查询命名为 OfficeList,其中包含一个名为 OfficeList 的列。文件关闭并加载,仅连接

将年龄组列表加载到 PowerQuery 中,并将查询命名为 AgeGroupList,其中包含一个名为 AgeGroupList 的列。文件关闭并加载,仅连接

将您的源数据加载到 power query 并使用下面的代码,粘贴到主页...高级编辑器...检查您在第一行中使用的 Table 名称是否正确。我的是 Table3

它的作用是 (a) 获取源数据并根据 Office 和 Age Group 进行分组,并对实例进行计数 (b) 使用 Office 和 Age Group 的每个组合创建一个 table (c) 将 a 合并到 b (d) 横向旋转数据以更好地格式化

如果您需要图像 2 而不是图像 3,请删除最后一个关键步骤

// group and count the source data
let Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Office", type text}, {"Age Group", type text}, {"Tracking #", Int64.Type}}),
#"Grouped Rows" = Table.Group(#"Changed Type", {"Office", "Age Group"}, {{"Count", each Table.RowCount(_), Int64.Type}}),

// set up shell to receive that data
#"Added Custom" = Table.AddColumn(OfficeList, "Custom", each AgreGoupList),
#"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"AgeGroupList"}, {"AgeGroupList"}),

// merge in source data and pivot
#"Merged Queries" = Table.NestedJoin(#"Expanded Custom", {"OfficeList", "AgeGroupList"}, #"Grouped Rows", {"Office", "Age Group"}, "Table3", JoinKind.LeftOuter),
#"Expanded Table1" = Table.ExpandTableColumn(#"Merged Queries", "Table3", {"Count"}, {"Count"}),
#"Pivoted Column" = Table.Pivot(#"Expanded Table1", List.Distinct(#"Expanded Table1"[OfficeList]), "OfficeList", "Count", List.Sum)
in  #"Pivoted Column"

替代方法

let Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Office", type text}, {"Age Group", type text}, {"Tracking #", Int64.Type}}),
ConvertToZero = Table.TransformColumns(#"Changed Type",{{"Tracking #", each 1, Int64.Type}}),
// create a table to pad real data
#"Added Custom" = Table.AddColumn(OfficeList, "Custom", each AgreGoupList),
#"Expanded Custom" = Table.ExpandTableColumn(#"Added Custom", "Custom", {"AgeGroupList"}, {"AgeGroupList"}),
// merge the lists and pivot
#"Renamed Columns" = ConvertToZero & Table.RenameColumns(#"Expanded Custom",{{"OfficeList", "Office"}, {"AgeGroupList", "Age Group"}}),
#"Pivoted Column" = Table.Pivot(#"Renamed Columns", List.Distinct(#"Renamed Columns"[Office]), "Office", "Tracking #", List.Sum)
in  #"Pivoted Column"