Power Query跨两列统计出现次数并构建年度维度汇总报表的技术咨询
Power Query实现跨列统计并生成名称-年份汇总表
Hey James,我明白你的需求了——要把原始数据里Primary和Secondary两列的内容合并统计出现次数,最后生成一张以名称为X轴、年份为列的汇总表对吧?别发愁,咱们用Power Query就能搞定,我给你把思路和完整代码都整理好了:
核心思路
其实核心就是把分散在两列的待统计内容先合并到同一列,这样就能统一计数,再通过分组和透视得到你要的结构:
- 先把Primary、Secondary列转成行,合并成单一的"统计项"列
- 过滤掉空值,避免无效统计
- 按年份和统计项分组,计算每个组合的出现次数
- 最后透视年份列,生成目标汇总表
完整实现代码
直接把这段代码替换你现有Power Query的内容就行:
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcitKzEtOVdJRMjIwMtA3MgSy3FPzi9JBQm6Z+XmJSrE60UrBBYmZeSiKIHI6SmDpUG8UOY/EoqJKkJqi1BSwPLIlhvpGRjA5mFI0K6BKYMagWIGqHepUdDuMUN2Bbr4Rmj9RLMCUjAUA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Country = _t, Year = _t, Primary = _t, Secondary = _t]), #"Changed Type" = Table.TransformColumnTypes(Source,{{"Country", type text}, {"Year", type text}, {"Primary", type text}, {"Secondary", type text}}), // 步骤1:将Primary和Secondary列转成行,合并为"统计项"列 #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"Country", "Year"}, "Category", "统计项"), // 步骤2:过滤掉空的统计项 #"Filtered Rows" = Table.SelectRows(#"Unpivoted Columns", each ([统计项] <> null and [统计项] <> "")), // 步骤3:按Year和统计项分组,计算出现次数 #"Grouped Rows" = Table.Group(#"Filtered Rows", {"Year", "统计项"}, {{"出现次数", each Table.RowCount(_), Int64.Type}}), // 步骤4:透视年份列,生成汇总表 #"Pivoted Column" = Table.Pivot(#"Grouped Rows", List.Distinct(#"Grouped Rows"[Year]), "Year", "出现次数", List.Sum) in #"Pivoted Column"
关键步骤解释
- UnpivotOtherColumns:这一步是把除了Country、Year之外的列(也就是Primary和Secondary)转成两行,每一行对应一个统计项,这样所有要统计的内容都在"统计项"列里了,方便后续统一计数。
- Filtered Rows:如果你的原始数据里有空值,这一步能过滤掉,避免统计到无效的空内容。
- Grouped Rows:按年份和统计项分组,用
Table.RowCount计算每个组合的出现次数,也就是Primary+Secondary里该内容的总次数。 - Pivoted Column:把年份列转成表头,统计项作为行,出现次数作为单元格值,完美生成你要的汇总表结构。
如果还有细节需要调整,比如要不要保留Country列,或者空值处理的逻辑,随时改对应的步骤就行!
内容的提问来源于stack exchange,提问作者James Lamb




