You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:03:30