如何通过DAX创建虚拟表计算带到期日产品的账户余额?
解决方案:DAX度量值实现按日计算到期前账户余额
正确DAX度量值(两种写法)
写法一:遍历产品判断有效期
每日有效余额 = VAR 当前日期 = MAX(Dim_Date[Date ID]) RETURN SUMX( VALUES(Dim_Expiry_Date[Product Code]), IF( 当前日期 <= CALCULATE(MAX(Dim_Expiry_Date[Expiry Date])), CALCULATE(SUM(Fact_Account_Opening_Balance[Amount])), 0 ) )
写法二:先筛选有效产品再求和
每日有效余额 = VAR 当前日期 = MAX(Dim_Date[Date ID]) VAR 有效产品集合 = FILTER( ALL(Dim_Expiry_Date), Dim_Expiry_Date[Expiry Date] >= 当前日期 ) RETURN CALCULATE( SUM(Fact_Account_Opening_Balance[Amount]), TREATAS(有效产品集合, Fact_Account_Opening_Balance[Product Code]) )
逻辑说明
- 获取当前日期:通过
MAX(Dim_Date[Date ID])获取筛选上下文对应的单日日期(若需适配多日筛选,可根据需求调整为MIN或其他逻辑) - 匹配有效产品:
- 写法一:遍历每个产品,判断当前日期是否在该产品的到期日范围内,是则累加该产品的期初总余额
- 写法二:先筛选出所有到期日≥当前日期的产品,再通过
TREATAS将有效产品集合关联到期初余额表,仅对有效产品的余额求和
- 数据模型前提:需确保
Fact_Account_Opening_Balance(期初余额表)与Dim_Expiry_Date(到期日表)通过Product Code建立一对多关系,Dim_Date(日期表)作为日历表用于日期筛选
验证结果
- 11月1日-5日:三款产品均有效,总余额=3000+7000+11000=21000
- 11月6日-11日:B产品到期,总余额=3000+11000=14000
- 11月12日-30日:仅C产品有效,总余额=11000
原代码问题分析
- 原代码中
latestdate和latestexpirydate使用全局MIN值,未关联单个产品的到期日与当前筛选日期的对应关系 - 交叉连接后筛选逻辑错误,无法正确匹配每个日期下的有效产品集合,导致求和结果不符合预期
内容的提问来源于stack exchange,提问作者J Luo
相关产品推荐
相关产品推荐

