QlikSense中制作多列求和占比交互式饼图的方法
核心解决方案:把宽表转成窄表
QlikSense的饼图要求维度是离散的类别字段(比如物资名称),而你原表是宽表(每类物资单独一列),直接用宽表做会遇到维度无效的问题,因为聚合函数不能作为维度使用。
步骤1:在数据加载脚本中转换表结构
用Crosstable函数把宽表转成窄表,生成Material(物资类别)和DailyLoss(对应损失值)两个核心字段,同时保留Day字段用于交互筛选。
示例脚本(对应你的示例数据):
// 加载原始宽表 RawLossData: LOAD * INLINE [ Day, Tanks, Helicopter, APC 1, 3, 1, 4 2, 5, 3, 0 3, 10, 2, 12 ]; // 转换为窄表:Crosstable(新类别字段名, 新数值字段名, 保留的非透视列数) LossByCategory: Crosstable(Material, DailyLoss, 1) LOAD * Resident RawLossData; // 只保留需要的8类物资,替换为你的目标列名 WHERE Material IN ('Tanks', 'Helicopter', 'APC' /* 补充其余5类物资名称 */);
步骤2:制作饼图
- 维度设置:直接选择
Material字段(这就是你要的8类物资) - 度量设置:选以下两种写法之一,均支持实时交互筛选:
- 写法1(推荐,简洁):
=PercentOfTotal(Sum(DailyLoss)),然后将度量的数字格式改为百分比 - 写法2(手动计算):
=Sum(DailyLoss)/Sum(Total DailyLoss),同样设置为百分比格式
- 写法1(推荐,简洁):
你之前尝试无效的原因
- 把
Sum(列名)放维度:维度必须是原始的非聚合字段,聚合函数只能用于度量,因此会报错Invalid Dimension - 用
RangeSum:RangeSum是对同一行内的多列求和(比如单日总损失),不是跨所有行的全局总求和,所以得不到你要的占比结果
交互支持说明
因为我们保留了Day字段,其他工作表的筛选操作(比如选择特定日期范围)会自动同步到饼图,总损失和各类占比会实时更新,完全不需要硬编码数值。
内容的提问来源于stack exchange,提问作者Pk Lombardi
相关产品推荐
相关产品推荐

