You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Power BI跨月事件状态统计:优化Power Query代码实现多时段展示

解决Power BI跨月事件状态统计问题:新增Resolved与Current Opened列

问题说明

每日生成的事件包含当日/当月解决、跨月解决、永久未解决三种状态,需按特定月份统计各月已解决与未解决事件数量。现有列无法处理跨月场景(如2023-01-11创建、2023-03-15解决的事件,需在1月、2月标记为打开状态),要求保留源表所有列,新增Resolved和Current Opened列实现准确统计。

输入输出示例

输入源表

事件ID创建日期解决日期
12023-01-112023-01-15
22023-01-112023-03-15
32023-02-05null

输出结果表(含新增列)

事件ID创建日期解决日期统计月份ResolvedCurrent Opened
12023-01-112023-01-152023-01-01是否
22023-01-112023-03-152023-01-01否是
22023-01-112023-03-152023-02-01否是
22023-01-112023-03-152023-03-01是否
32023-02-05null2023-02-01否是
32023-02-05null2023-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

关键逻辑说明

  1. 月份展开:将跨月事件拆分为覆盖的每个月份的独立行,确保每个月份都能统计到该事件的状态
  2. Resolved列:仅当事件在当前统计月份完成解决时标记为"是",其余情况为"否"
  3. Current Opened列:事件未解决,或解决月份晚于当前统计月份时,标记为"是"(表示该月处于打开状态)
  4. 若不需要中文文本标识,可删除代码中替换布尔值为"是"/"否"的步骤,直接保留布尔类型结果

内容的提问来源于stack exchange,提问作者benjin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:23:20