DAX实现计划与执行生产汇总表的合并问题求助
问题描述
需要合并tbPlan(计划生产表)与tbExecuted(实际执行表),生成包含Date、SKU、Shift、Plan、Executed的汇总表,无对应数据时显示0。
表结构与示例数据
tbPlan字段:Date、SKU、Shift、QtyDate SKU Shift Qty 1/1/2023 A 1 10 1/1/2023 A 2 5 1/1/2023 B 1 10 tbExecuted字段:Date、SKU、Shift、QtyDate SKU Shift Qty 1/1/2023 A 1 10 2/1/2023 A 1 5 1/1/2023 B 1 5 1/1/2023 B 2 5
尝试过的方法
使用NATURALLEFTOUTERJOIN和NATURALINNERJOIN均无法满足需求:
NATURALLEFTOUTERJOIN仅保留左表的所有行,右表独有的行(比如2/1/2023 A 1)无法纳入结果NATURALINNERJOIN只保留两表交集的行,过滤掉所有单边存在的行
尝试的DAX代码:
FACT-TabelaAderencia = VAR A = SELECTCOLUMNS( summProducao ;"Data"; summProducao[DataProducao]+0 ;"SKU"; Upper(summProducao[SKU]) ;"Turno"; summProducao[Turno]*1 ;"Produzido"; summProducao[Cargas Produzidas] ) VAR B = SELECTCOLUMNS( summPlanejamento ;"Data"; summPlanejamento[DataProgramada1]+0 ;"SKU"; UPPER(summPlanejamento[SKU]) ;"Turno"; summPlanejamento[Turno]*1 ;"Planejado"; summPlanejamento[Planejadas] ) VAR Result = NATURALLEFTOUTERJOIN(A; B) Return Result
解决方案
DAX没有直接的全外连接函数,所以需要先构建包含所有唯一Date/SKU/Shift组合的基础键表,再分别关联计划和实际数据,用COALESCE把空值替换为0。
方法一:基于原始表的通用实现
FACT-TabelaAderencia = // 1. 生成两表所有唯一的Date/SKU/Shift组合 VAR AllKeys = DISTINCT( UNION( SELECTCOLUMNS(tbPlan, "Date", tbPlan[Date], "SKU", tbPlan[SKU], "Shift", tbPlan[Shift]), SELECTCOLUMNS(tbExecuted, "Date", tbExecuted[Date], "SKU", tbExecuted[SKU], "Shift", tbExecuted[Shift]) ) ) // 2. 关联计划数据,无对应值填0 VAR WithPlan = ADDCOLUMNS( AllKeys, "Plan", COALESCE( CALCULATE(SUM(tbPlan[Qty]), tbPlan[Date] = [Date], tbPlan[SKU] = [SKU], tbPlan[Shift] = [Shift] ), 0 ) ) // 3. 关联实际执行数据,无对应值填0 VAR FinalResult = ADDCOLUMNS( WithPlan, "Executed", COALESCE( CALCULATE(SUM(tbExecuted[Qty]), tbExecuted[Date] = [Date], tbExecuted[SKU] = [SKU], tbExecuted[Shift] = [Shift] ), 0 ) ) RETURN FinalResult
方法二:适配你现有变量的修改版本
如果要沿用你原代码中对summProducao(实际)和summPlanejamento(计划)的字段转换逻辑:
FACT-TabelaAderencia = // 统一格式化两表的键字段和数值字段 VAR ExecutedClean = SELECTCOLUMNS( summProducao, "Data", summProducao[DataProducao] + 0, "SKU", UPPER(summProducao[SKU]), "Turno", summProducao[Turno] * 1, "Produzido", summProducao[Cargas Produzidas] ) VAR PlanClean = SELECTCOLUMNS( summPlanejamento, "Data", summPlanejamento[DataProgramada1] + 0, "SKU", UPPER(summPlanejamento[SKU]), "Turno", summPlanejamento[Turno] * 1, "Planejado", summPlanejamento[Planejadas] ) // 生成所有唯一的键组合 VAR AllKeys = DISTINCT( UNION( SELECTCOLUMNS(ExecutedClean, "Data", [Data], "SKU", [SKU], "Turno", [Turno]), SELECTCOLUMNS(PlanClean, "Data", [Data], "SKU", [SKU], "Turno", [Turno]) ) ) // 关联计划数据 VAR WithPlan = ADDCOLUMNS( AllKeys, "Planejado", COALESCE( CALCULATE(SUM(PlanClean[Planejado]), PlanClean[Data] = [Data], PlanClean[SKU] = [SKU], PlanClean[Turno] = [Turno] ), 0 ) ) // 关联实际数据 VAR FinalResult = ADDCOLUMNS( WithPlan, "Produzido", COALESCE( CALCULATE(SUM(ExecutedClean[Produzido]), ExecutedClean[Data] = [Data], ExecutedClean[SKU] = [SKU], ExecutedClean[Turno] = [Turno] ), 0 ) ) RETURN FinalResult
核心逻辑说明
UNION+DISTINCT确保不会遗漏任何单边存在的行,生成完整的键组合表COALESCE直接把无对应数据时的空值替换为0CALCULATE+SUM可以处理同一键有多行数据的情况,自动汇总数量
内容的提问来源于stack exchange,提问作者Paulo Maciel
相关产品推荐
相关产品推荐

