如何在Power BI中动态按5年间隔分组统计客户数量?
按5年间隔分组统计客户数量的M语言实现思路
一、数据预处理:逆透视年份列
原始数据里年份是列名,先转成行结构,只保留有活跃记录的行:
- 用
Table.UnpivotOtherColumns把除了客户ID之外的年份列逆透视成年份和状态两列; - 过滤掉空值或非活跃的记录,只留有效交易行。
M语言代码示例:
let 源 = 你的数据源, 逆透视年份列 = Table.UnpivotOtherColumns(源, {"客户ID"}, "年份", "状态"), 筛选活跃记录 = Table.SelectRows(逆透视年份列, each [状态] <> null and [状态] = "活跃") in 筛选活跃记录
二、生成5年区间分组
把年份转成数值后,计算对应的5年区间标签:
- 先将
年份列转为数值类型; - 对每个年份计算区间起始年:
Number.RoundDown((年份-1)/5)*5 +1,结束年就是起始年+4,组合成XXXX-XXXX的区间格式。
M语言代码示例:
let 年份转数值 = Table.TransformColumns(筛选活跃记录, {"年份", each Number.From(_), type number}), 添加5年区间列 = Table.AddColumn(年份转数值, "5年区间", each let 起始年 = Number.RoundDown(([年份] - 1) / 5) * 5 + 1, 结束年 = 起始年 + 4 in Text.From(起始年) & "-" & Text.From(结束年) ) in 添加5年区间列
三、去重统计客户数
同一个客户在同一区间内多次活跃只算一次,所以先去重再分组计数:
- 按
客户ID和5年区间去重,避免重复统计; - 按
5年区间分组,统计每组的客户数量。
M语言代码示例:
let 客户区间去重 = Table.Distinct(添加5年区间列, {"客户ID", "5年区间"}), 分组统计客户数 = Table.Group(客户区间去重, {"5年区间"}, {{"客户数量", each Table.RowCount(_), Int64.Type}}) in 分组统计客户数
四、动态调整分组间隔(可选)
如果需要支持切换成3年、10年等不同间隔,可做成参数化:
- 在Power Query中创建整数参数
年份间隔,默认值设为5; - 把步骤二中的
5替换为参数年份间隔,代码调整为:
起始年 = Number.RoundDown(([年份] - 1) / 年份间隔) * 年份间隔 + 1, 结束年 = 起始年 + 年份间隔 - 1
之后就能通过参数控件动态调整分组间隔,适配不同可视化需求。
内容的提问来源于stack exchange,提问作者PowerStar
相关产品推荐
相关产品推荐

