DAX技术问题:用SUMMARIZECOLUMNS创建表并将空白值填充为0
DAX解决无记录日期/财周的isAvailable填充0问题
原代码的问题在于SUMMARIZECOLUMNS仅返回存在客户记录的客户-财周组合,没有记录的组合不会被生成,自然无法填充0。要解决这个问题,需要先生成所有可能的客户-财周组合,再与实际记录匹配,填充对应的值。
修改后的DAX代码
Adherence = // 1. 获取当前筛选下的客户唯一组合(姓名+编号) var CustomerCombination = SUMMARIZE( Customer, Customer[CUST_NAME_EXT], Customer[CUSTOMER_EXT] ) // 2. 获取当前筛选下的财年-财周唯一组合 var FiscalPeriod = SUMMARIZE( 'Fiscal Calendar', 'Fiscal Calendar'[fiscalYear], 'Fiscal Calendar'[fiscalWeek] ) // 3. 生成所有客户-财周的笛卡尔积(所有可能的组合) var AllCombinations = CROSSJOIN( CustomerCombination, FiscalPeriod ) // 4. 获取有客户记录的组合,标记为1 var ExistingRecords = SUMMARIZECOLUMNS( Customer[CUST_NAME_EXT], Customer[CUSTOMER_EXT], 'Fiscal Calendar'[fiscalYear], 'Fiscal Calendar'[fiscalWeek], "isAvailable", 1 ) // 5. 左连接所有组合与现有记录,空值填充为0 var Result = ADDCOLUMNS( AllCombinations, "isAvailable", VAR CurrentCustName = [CUST_NAME_EXT] VAR CurrentCustNum = [CUSTOMER_EXT] VAR CurrentYear = [fiscalYear] VAR CurrentWeek = [fiscalWeek] RETURN COALESCE( LOOKUPVALUE( ExistingRecords[isAvailable], ExistingRecords[CUST_NAME_EXT], CurrentCustName, ExistingRecords[CUSTOMER_EXT], CurrentCustNum, ExistingRecords[fiscalYear], CurrentYear, ExistingRecords[fiscalWeek], CurrentWeek ), 0 ) ) return Result
代码说明
- CustomerCombination:提取当前筛选范围内的所有客户姓名+编号的唯一组合,避免重复客户。
- FiscalPeriod:提取当前筛选范围内的所有财年-财周唯一组合,确保覆盖所有需要展示的时间维度。
- AllCombinations:通过
CROSSJOIN生成客户和财周的全量组合,保证没有遗漏的行。 - ExistingRecords:保留原逻辑,仅标记有实际记录的组合为1。
- Result:使用
LOOKUPVALUE匹配全量组合与现有记录,用COALESCE将匹配不到的空值替换为0。
注意事项
- 如果需要按**日期(fiscalDate)**而不是财周展示,只需把
FiscalPeriod中的财年-财周替换为fiscalDate即可,其余逻辑不变。 - 确保
Customer和Fiscal Calendar的关系正确,筛选器会自动影响最终的组合范围。
内容的提问来源于stack exchange,提问作者Mellic
相关产品推荐
相关产品推荐

