如何用Power Query基于日期区间生成Power BI表重复行?
Power Query实现跨月份CustomKey行拆分方案
需求回顾
原始表结构:
| MID | SIP | ValidFrom | ValidTo | CustomKey |
|---|---|---|---|---|
| 1 | c2 | 08/01/2022 | 11/30/2022 | 1_c2_08_2022 |
| 2 | c3 | 12/24/2022 | 12/31/2022 | 2_c3_12_2022 |
需要转换为每行对应ValidFrom到ValidTo之间的所有月份,生成对应CustomKey的结构:
| MID | SIP | ValidFrom | ValidTo | CustomKey |
|---|---|---|---|---|
| 1 | c2 | 08/01/2022 | 11/30/2022 | 1_c2_08_2022 |
| 1 | c2 | 08/01/2022 | 11/30/2022 | 1_c2_09_2022 |
| 1 | c2 | 08/01/2022 | 11/30/2022 | 1_c2_10_2022 |
| 1 | c2 | 08/01/2022 | 11/30/2022 | 1_c2_11_2022 |
| 2 | c3 | 12/24/2022 | 12/31/2022 | 2_c3_12_2022 |
具体实现步骤
1. 确保日期列类型正确
选中ValidFrom和ValidTo列,右键选择更改类型→日期,确保这两列是标准日期类型(避免后续函数报错)。
2. 添加自定义列生成月份对应的CustomKey列表
在Power Query编辑器中,点击添加列→自定义列,输入以下公式:
= let // 获取有效期起始和结束的当月第一天 StartMonth = Date.StartOfMonth([ValidFrom]), EndMonth = Date.StartOfMonth([ValidTo]), // 生成从起始月到结束月的所有月份序列 MonthSequence = List.Generate( () => StartMonth, each _ <= EndMonth, each Date.AddMonths(_, 1) ), // 对每个月份生成对应的CustomKey GenerateCustomKey = List.Transform(MonthSequence, (monthDate) => Text.From([MID]) & "_" & [SIP] & "_" & Text.PadStart(Text.From(Date.Month(monthDate)), 2, "0") & "_" & Text.From(Date.Year(monthDate)) ) in GenerateCustomKey
将自定义列命名为CustomKeyList。
3. 展开列表为多行
点击CustomKeyList列右侧的展开按钮(双向箭头),选择展开到新行,此时每行都会拆分为对应月份的多行记录。
4. 整理列结构
删除原有的CustomKey列,将CustomKeyList列重命名为CustomKey,即可得到目标表结构。
报错原因说明
你遇到的Expression.Error: We cannot apply field access to the type Date.错误,通常是以下两种情况导致:
ValidFrom或ValidTo列不是标准日期类型,而是文本或其他类型,导致函数无法识别日期操作;- 使用
List.Generate时错误地对日期值使用了字段访问语法(比如试图用[Date]访问日期属性,但实际是直接操作日期值)。
内容的提问来源于stack exchange,提问作者Ananda Prasad Bandaru
相关产品推荐
相关产品推荐

