DAX计算产品托盘平均售罄时长的技术咨询
DAX计算产品托盘平均售罄时长的技术咨询
看起来你遇到的核心问题是销售数据和托盘发货数据没有直接关联,导致没法精准追踪每个托盘的售罄周期,而且现有度量值只在第一次售罄时能出结果,后续的计算就失效了。我来帮你梳理下思路,一步步解决这个问题:
第一步:先建立表之间的核心关联
既然FacStoreOrder(托盘发货表)和FacSales(销售表)目前没有直接关联,我们需要通过共享的维度表搭建间接关系,这是DAX计算的基础:
- 确保
Dim_Article(产品维度表)同时关联FacStoreOrder和FacSales - 确保
Dim_Store(门店维度表)同时关联FacStoreOrder和FacSales Dim_Calendar(日期/周维度表)也要关联这两张事实表,这样才能按时间维度做累计销量计算
第二步:计算单个托盘的售罄周数
我们需要先追踪从托盘到货周开始的累计销量,直到累计销量超过托盘的总承载量(ArticlePalletUnits)。先做两个核心度量值:
1. 累计销量度量值
CumulativeUnitsSold = CALCULATE( SUM(Fac_Sales[SumUnitsSold]), FILTER( ALLSELECTED(Dim_Calendar), Dim_Calendar[WeekNumber] <= MAX(Dim_Calendar[WeekNumber]) ), ALLEXCEPT(Fac_Sales, Dim_Article[Article], Dim_Store[Store]) )
2. 单托盘售罄周数度量值
WeeksToSellPallet = VAR PalletTotalUnits = MAX(Fac_OrderStore[ArticlePalletUnits]) VAR PalletReceivedWeek = MAX(Fac_OrderStore[ReceivedWeek]) -- 若订单表无此字段,可从到货日期转换为周数 -- 筛选从到货周开始的累计销量,找到首次超过托盘容量的周数 VAR FirstSoldOutWeek = MINX( FILTER( ALL(Dim_Calendar), Dim_Calendar[WeekNumber] >= PalletReceivedWeek && [CumulativeUnitsSold] >= PalletTotalUnits ), Dim_Calendar[WeekNumber] ) RETURN -- 计算从到货到售罄的周差,若还未售罄则返回空 IF(ISBLANK(FirstSoldOutWeek), BLANK(), FirstSoldOutWeek - PalletReceivedWeek)
第三步:计算平均售罄周数
有了单个托盘的售罄周数,就可以计算整体平均了:
AverageWeeksPalletSales = VAR TotalValidPallets = COUNTROWS(FILTER(Fac_OrderStore, NOT(ISBLANK([WeeksToSellPallet])))) VAR TotalWeeksAcrossPallets = SUMX(Fac_OrderStore, [WeeksToSellPallet]) RETURN DIVIDE(TotalWeeksAcrossPallets, TotalValidPallets, BLANK())
为什么你的原有度量值失效?
你的原有度量值用DIVIDE([#Weeks], [SumPalletsSold])再乘以门店数,这个逻辑没有关联托盘到货时间和累计销量的先后关系,只是做了简单的数值除法,所以只能在第一次售罄时碰巧得到一个结果,后续周数计算没有锚定托盘到货的时间起点,自然就失去了准确性。
额外优化提示
如果同一个门店的同一产品有多次托盘到货记录,建议给每个到货批次添加唯一的PalletID标识,然后在计算累计销量时限定为该PalletID对应的到货周之后的范围,避免不同批次的销量互相干扰。
备注:内容来源于stack exchange,提问作者Descartes
相关产品推荐
相关产品推荐

