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

Qlik Sense:带筛选功能的十分位分析问题求助

Qlik分位数客户筛选&分位数固化解决方案

一、创建筛选器:选择整体的10%/20%/30%客户

要选全量客户里的TOP10%/20%/30%,核心是让分位数基准固定在全量数据上,不随前端筛选变化,两种实现方式:

办法1:脚本预先计算(推荐)

在数据加载脚本里直接给每个客户打上层级标签,标签基于全量数据生成,不会随筛选变动:

LOAD
    Customer,
    Sum(Profit) as CustomerProfit,
    // 给客户打TOP N%分组标签
    If(CustomerProfit >= Fractile(TOTAL CustomerProfit, 0.9), 'TOP 10%',
       If(CustomerProfit >= Fractile(TOTAL CustomerProfit, 0.8), 'TOP 20%',
          If(CustomerProfit >= Fractile(TOTAL CustomerProfit, 0.7), 'TOP 30%', '其他'))) as CustomerTier
RESIDENT 你的数据源表
GROUP BY Customer;

之后直接把CustomerTier字段拖到筛选面板,就能直接选择对应的客户群体。

办法2:前端创建计算维度(无需修改脚本)

不想动脚本的话,创建一个计算维度,强制用全量客户的利润计算分位数:

=Aggr(
    If(Sum(Profit) >= Fractile(TOTAL <Customer> Sum(Profit), 0.9), 'TOP 10%',
       If(Sum(Profit) >= Fractile(TOTAL <Customer> Sum(Profit), 0.8), 'TOP 20%',
          If(Sum(Profit) >= Fractile(TOTAL <Customer> Sum(Profit), 0.7), 'TOP 30%', '其他'))),
    Customer
)

把这个计算维度添加到筛选面板,筛选时就是基于全量客户群体的结果。


二、解决筛选后分位数重算的问题

之前选10%客户后系统会重新拆分分位数,是因为原表达式的TOTAL会跟随当前筛选的子集计算。要解决这个问题,必须让分位数基准固定在全量数据上:

方案1:用脚本预计算的分位数等级

在脚本里给每个客户计算好基于全量数据的分位数等级(1=最高利润,10=最低):

LOAD
    Customer,
    CustomerProfit,
    // 先计算全量的分位数阈值
    Fractile(TOTAL CustomerProfit, 0.1) as P10,
    Fractile(TOTAL CustomerProfit, 0.2) as P20,
    Fractile(TOTAL CustomerProfit, 0.3) as P30,
    ...
    Fractile(TOTAL CustomerProfit, 0.9) as P90,
    // 基于全量阈值计算分位数等级
    If(CustomerProfit > P90, 1,
       If(CustomerProfit > P80, 2,
          If(CustomerProfit > P70, 3,
             ...
             If(CustomerProfit > P10, 9, 10)))) as DecileRank
RESIDENT CustomerProfitTable;

后续筛选时,选DecileRank <=1对应TOP10%,<=2对应TOP20%,<=3对应TOP30%。就算筛选了这些客户,显示的等级还是基于全量数据的,不会重新拆分。

方案2:前端用TOTAL <ALL>强制全量计算

如果必须在前端表达式里修改,把原表达式中的TOTAL替换成TOTAL <ALL>,强制分位数永远基于全量客户的利润计算,不受筛选影响:

=Aggr(
    If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.1), 10,
       If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.2), 9,
          If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.3), 8,
             If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.4), 7,
                If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.5), 6,
                   If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.6), 5,
                      If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.7), 4,
                         If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.8), 3,
                            If(Sum(Profit) <= Fractile(TOTAL <ALL> Aggr(Sum(Profit), Customer), 0.9), 2, 1))))))))),
    Customer
)

这样即使筛选了部分客户,显示的分位数层级还是全量数据的结果,不会把选中的10%客户再拆分成10份。


内容的提问来源于stack exchange,提问作者learnhowtocode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:45:26