Power BI计算列:维度表日期与事实表多日期对比问题
问题描述
表结构
客户维度表(DIM_Customers)
| CustID | CreatedDate |
|---|---|
| 10000 | 1/1/2000 |
| 10001 | 1/1/2000 |
| 10002 | 1/2/2000 |
销售事实表(Fact_Sales)
| CustID | OrderDate |
|---|---|
| 10000 | 2/1/2000 |
| 10000 | 2/2/2000 |
| 10001 | 1/1/2000 |
| 10002 | 3/15/2000 |
需求规则
- 若客户首次购买在7月,需判断是否在8、9、10月再次购买
- 同一月内多次购买不计入,仅关注是否在后续三个月复购
- 仅关注首次购买的月份,7月1日和7月31日首次购买的客户视为相同情况
- 在客户维度表中创建计算列,符合条件返回1,否则返回0
当前代码问题
原尝试的DAX代码:
IF( OR( AND(DIM_Customers[Second Order Date].[Month] <> DIM_Customers[DateFirstPurchase].[Month], DATEDIFF(DIM_Customers[DateFirstPurchase], DIM_Customers[Second Order Date].[Date], MONTH) <= 3), AND(DIM_Customers[Third Order Date].[Month] <> DIM_Customers[DateFirstPurchase].[Month], DATEDIFF(DIM_Customers[DateFirstPurchase], DIM_Customers[Third Order Date].[Date], MONTH) <= 3) ) , 1, 0 )
该代码仅判断第二、第三次订单,无法覆盖首次多次购买在同月,但后续有符合条件订单的情况,且依赖预定义的订单日期列,不适用于购买次数不固定的客户。
解决方案
使用DAX动态关联销售表数据,处理任意购买次数的客户,代码如下:
Has3MonthRepeatPurchase = VAR CustomerID = DIM_Customers[CustID] VAR FirstPurchaseMonth = CALCULATE( MIN(Fact_Sales[OrderDate]), Fact_Sales[CustID] = CustomerID ) VAR FirstPurchaseMonthStart = DATE(YEAR(FirstPurchaseMonth), MONTH(FirstPurchaseMonth), 1) VAR ThreeMonthsLater = EOMONTH(FirstPurchaseMonthStart, 3) VAR DistinctOrderMonths = SUMMARIZE( FILTER(Fact_Sales, Fact_Sales[CustID] = CustomerID), YEAR(Fact_Sales[OrderDate]), MONTH(Fact_Sales[OrderDate]) ) VAR HasValidRepeat = COUNTROWS( FILTER( DistinctOrderMonths, DATE([Year], [Month], 1) > FirstPurchaseMonthStart && DATE([Year], [Month], 1) <= ThreeMonthsLater ) ) > 0 RETURN IF(HasValidRepeat, 1, 0)
代码说明
- 关联客户ID:获取当前行的客户ID,用于匹配销售表数据
- 确定首次购买月份:计算该客户最早的订单日期,取其所在月份的起始日
- 计算截止日期:用
EOMONTH得到首次购买月份后第三个月的月末 - 去重订单月份:提取该客户所有订单的年月组合,剔除同月多次购买的重复项
- 判断有效复购:筛选出在首次购买月份之后、且在三个月截止日期内的订单月份,存在则返回1,否则返回0
内容的提问来源于stack exchange,提问作者schaefferda
相关产品推荐
相关产品推荐

