Power BI跨月事件状态统计:优化Power Query代码实现多时段展示
解决Power BI跨月事件状态统计问题:新增Resolved与Current Opened列
问题说明
每日生成的事件包含当日/当月解决、跨月解决、永久未解决三种状态,需按特定月份统计各月已解决与未解决事件数量。现有列无法处理跨月场景(如2023-01-11创建、2023-03-15解决的事件,需在1月、2月标记为打开状态),要求保留源表所有列,新增Resolved和Current Opened列实现准确统计。
输入输出示例
输入源表
| 事件ID | 创建日期 | 解决日期 |
|---|---|---|
| 1 | 2023-01-11 | 2023-01-15 |
| 2 | 2023-01-11 | 2023-03-15 |
| 3 | 2023-02-05 | null |
输出结果表(含新增列)
| 事件ID | 创建日期 | 解决日期 | 统计月份 | Resolved | Current Opened |
|---|---|---|---|---|---|
| 1 | 2023-01-11 | 2023-01-15 | 2023-01-01 | 是 | 否 |
| 2 | 2023-01-11 | 2023-03-15 | 2023-01-01 | 否 | 是 |
| 2 | 2023-01-11 | 2023-03-15 | 2023-02-01 | 否 | 是 |
| 2 | 2023-01-11 | 2023-03-15 | 2023-03-01 | 是 | 否 |
| 3 | 2023-02-05 | null | 2023-02-01 | 否 | 是 |
| 3 | 2023-02-05 | null | 2023-03-01 | 否 | 是 |
注:永久未解决事件默认持续到当前月份,可按需调整截止时间
Power Query解决方案代码
将以下代码替换你的现有Power Query逻辑,保留源表所有列并生成目标列:
let Source = 你的源表名称, // 替换为实际源表引用 // 确定事件的结束月份:未解决则用当前月份,已解决则用解决日期所在月份 AddEndMonth = Table.AddColumn(Source, "结束月份", each if [解决日期] = null then Date.StartOfMonth(DateTime.LocalNow()) else Date.StartOfMonth([解决日期])), // 生成事件覆盖的所有月份列表 AddMonthList = Table.AddColumn(AddEndMonth, "统计月份列表", each let StartMonth = Date.StartOfMonth([创建日期]), EndMonth = [结束月份], MonthList = List.Generate( () => StartMonth, each _ <= EndMonth, each Date.AddMonths(_, 1) ) in MonthList ), // 展开月份列表,每个事件在覆盖的月份各生成一行 ExpandMonthList = Table.ExpandListColumn(AddMonthList, "统计月份列表"), RenameMonthCol = Table.RenameColumns(ExpandMonthList, {{"统计月份列表", "统计月份"}}), // 新增Resolved列:标记事件是否在当前统计月份被解决 AddResolved = Table.AddColumn(RenameMonthCol, "Resolved", each not IsNull([解决日期]) and Date.StartOfMonth([解决日期]) = [统计月份], type text ), // 替换为中文标识(可选,若需布尔值可删除此步骤) ReplaceResolvedText = Table.ReplaceValue(AddResolved, true, "是", Replacer.ReplaceValue, {"Resolved"}), ReplaceResolvedFalse = Table.ReplaceValue(ReplaceResolvedText, false, "否", Replacer.ReplaceValue, {"Resolved"}), // 新增Current Opened列:标记事件在当前统计月份是否处于打开状态 AddCurrentOpened = Table.AddColumn(ReplaceResolvedFalse, "Current Opened", each IsNull([解决日期]) or Date.StartOfMonth([解决日期]) > [统计月份], type text ), // 替换为中文标识(可选,若需布尔值可删除此步骤) ReplaceOpenedText = Table.ReplaceValue(AddCurrentOpened, true, "是", Replacer.ReplaceValue, {"Current Opened"}), ReplaceOpenedFalse = Table.ReplaceValue(ReplaceOpenedText, false, "否", Replacer.ReplaceValue, {"Current Opened"}), // 移除临时列,保留源表所有列+新增列 CleanUp = Table.RemoveColumns(ReplaceOpenedFalse, {"结束月份"}) in CleanUp
关键逻辑说明
- 月份展开:将跨月事件拆分为覆盖的每个月份的独立行,确保每个月份都能统计到该事件的状态
- Resolved列:仅当事件在当前统计月份完成解决时标记为"是",其余情况为"否"
- Current Opened列:事件未解决,或解决月份晚于当前统计月份时,标记为"是"(表示该月处于打开状态)
- 若不需要中文文本标识,可删除代码中替换布尔值为"是"/"否"的步骤,直接保留布尔类型结果
内容的提问来源于stack exchange,提问作者benjin
相关产品推荐
相关产品推荐

