Power BI使用DAX实现客户已购及未购产品列表动态展示
DAX实现动态未购产品列表方案
前置模型要求
- 必须搭建标准维度模型:独立
客户表(存所有客户唯一值)、产品表(存所有产品唯一值,包含甜/咸口等分类字段)、日期表(连续日期范围),三张表均与销售明细事实表建立单方向一对多关系。 - 所有切片器、表格维度字段必须从上述维度表取用,禁止直接引用销售明细表的客户、产品、日期字段,否则会出现筛选上下文错乱。
已购产品度量值(兼容全筛选场景)
如果之前写的度量值在加产品分类切片器时出现异常,可以替换为以下标准写法:
已购产品 = VAR CurrCust = SELECTEDVALUE('客户表'[客户名]) VAR BoughtSet = CALCULATETABLE( VALUES('产品表'[产品名]), REMOVEFILTERS('客户表'), '客户表'[客户名] = CurrCust, NOT ISEMPTY('销售明细表') ) RETURN CONCATENATEX(BoughtSet, '产品表'[产品名], ", ")
核心:未购产品(营销机会)度量值
逻辑为:取当前筛选上下文(日期、产品分类等切片器生效后)的全量可见产品,减去当前客户已购产品,剩余部分拼接为逗号分隔字符串,无剩余产品时自动返回空值,完全匹配“买完所有品类则留空”的要求。
未购产品 = VAR CurrCust = SELECTEDVALUE('客户表'[客户名]) // 获取当前筛选条件下所有可见的产品集合(不受客户筛选影响) VAR AllVisibleProd = CALCULATETABLE( VALUES('产品表'[产品名]), REMOVEFILTERS('客户表') ) // 获取当前客户在当前筛选条件下已购的产品集合 VAR BoughtProd = CALCULATETABLE( VALUES('产品表'[产品名]), REMOVEFILTERS('客户表'), '客户表'[客户名] = CurrCust, NOT ISEMPTY('销售明细表') ) // 计算两个集合的差集,即未购产品 VAR UnboughtProd = EXCEPT(AllVisibleProd, BoughtProd) // 拼接结果,差集为空时自动返回空 RETURN CONCATENATEX(UnboughtProd, '产品表'[产品名], ", ")
验证与注意事项
- 基础场景验证:不添加任何筛选时,返回结果与预期完全一致:
- Amazing:已购全品类,未购列为空
- BBD corp:未购
sweets - Craazy kidz:未购
sweets, crisps - Dunking bits:未购
crisps
- 动态交互验证:添加「甜口/咸口」分类切片器时,两个列表会自动排除不在所选分类下的产品,比如仅选“咸口”时,可见产品只有crisps,此时未购列会自动更新为:Amazing空、BBD corp空、Craazy kidz显示
crisps、Dunking bits显示crisps。 - 常见问题排查:
- 如果度量值返回空值,先检查维度表和事实表的关系是否正常,有没有开启双向筛选导致筛选溢出
- 如果需要按产品其他属性(比如子分类、品牌)拼接,只需要把代码里的
'产品表'[产品名]替换为对应字段即可,逻辑通用
内容的提问来源于stack exchange,提问作者KieranIngram
相关产品推荐
相关产品推荐

