如何用DAX实现SALES与ROYALTIES表的关联整合报表?
用DAX实现两事实表内连接生成新表
你需要实现的是和SQL内连接等价的DAX表生成逻辑,基于已有的维度表关联关系,有两种常用实现方式:
方法1:使用NATURALINNERJOIN函数(推荐,简洁直观)
这个函数会自动匹配两个表中列名完全相同的字段进行内连接,和你的SQL逻辑完全对应:
Sales_Royalties_Combined = NATURALINNERJOIN ( SELECTCOLUMNS(SALES, "Store", SALES[Store], "Year", SALES[Year], "Category", SALES[Category], "SalesAmount", SALES[SalesAmount]), SELECTCOLUMNS(ROYALTIES, "Store", ROYALTIES[Store], "Year", ROYALTIES[Year], "Category", ROYALTIES[Category], "initial_value", ROYALTIES[initial_value], "final_value", ROYALTIES[final_value], "royalties_pct", ROYALTIES[royalties_pct]) )
注意:如果两个表中存在其他同名但不需要参与连接的列,用
SELECTCOLUMNS先筛选出目标字段,能避免不必要的匹配干扰。
方法2:使用ADDCOLUMNS + LOOKUPVALUE函数(适合自定义匹配逻辑)
如果需要更灵活的匹配规则(比如列名不一致),可以基于SALES表的基础字段,从ROYALTIES表中精准查找对应值:
Sales_Royalties_Combined = ADDCOLUMNS ( SELECTCOLUMNS(SALES, "Store", SALES[Store], "Year", SALES[Year], "Category", SALES[Category], "SalesAmount", SALES[SalesAmount]), "initial_value", LOOKUPVALUE(ROYALTIES[initial_value], ROYALTIES[Store], [Store], ROYALTIES[Year], [Year], ROYALTIES[Category], [Category]), "final_value", LOOKUPVALUE(ROYALTIES[final_value], ROYALTIES[Store], [Store], ROYALTIES[Year], [Year], ROYALTIES[Category], [Category]), "royalties_pct", LOOKUPVALUE(ROYALTIES[royalties_pct], ROYALTIES[Store], [Store], ROYALTIES[Year], [Year], ROYALTIES[Category], [Category]) )
注意:
LOOKUPVALUE要求匹配条件返回唯一值,你已通过维度表保证了Store/Year/Category的唯一性关联,因此不会出现多值匹配错误。
基于维度表的优化实现(大数据量场景更高效)
由于你已经创建了Store、Year、Category三个维度表并建立了一对多关系,也可以直接基于维度表构建组合表,性能表现更优:
Sales_Royalties_Combined = FILTER( ADDCOLUMNS ( CROSSJOIN(Store, Year, Category), "SalesAmount", CALCULATE(SUM(SALES[SalesAmount])), "initial_value", CALCULATE(MAX(ROYALTIES[initial_value])), "final_value", CALCULATE(MAX(ROYALTIES[final_value])), "royalties_pct", CALCULATE(MAX(ROYALTIES[royalties_pct])) ), NOT(ISBLANK([SalesAmount])) && NOT(ISBLANK([initial_value])) )
这里的
SUM/MAX需根据你的实际数据聚合逻辑调整,最后用FILTER过滤掉无销售或无 royalty 数据的无效行。
内容的提问来源于stack exchange,提问作者pofferbacco
相关产品推荐
相关产品推荐

