QlikSense动态交叉表中按行计算累计求和的问题
问题描述
我有按month统计的Sales度量,原始数据如下:
| month | Sales |
|---|---|
| 01-2023 | 10 |
| 02-2023 | 20 |
| 03-2023 | 15 |
| 04-2023 | 30 |
| 05-2023 | 13 |
需要在动态交叉表中展示累计求和结果,期望效果如下:
| month | 01-2023 | 02-2023 | 03-2023 | 04-2023 | 05-2023 |
|---|---|---|---|---|---|
| Sales | 10 | 30 | 45 | 75 | 88 |
尝试使用公式:
RangeSum(Above(TOTAL Sum(Sales), 0, RowNO(TOTAL)))
该公式在普通列展示的表格中有效,但应用到动态交叉表(行展示)时,结果全为0:
| month | 01-2023 | 02-2023 | 03-2023 | 04-2023 | 05-2023 |
|---|---|---|---|---|---|
| Sales | 0 | 0 | 0 | 0 | 0 |
不想通过修改脚本解决(会导致应用体积翻倍),寻求其他方法。
解决方案
在动态交叉表中,RowNO(TOTAL)的逻辑和普通表格不兼容——交叉表是将维度扩展为列,行维度的上下文发生了变化,因此原公式无法生效。以下是两种无需修改脚本的解决方法:
方法1:基于Aggr函数的累计计算
通过Aggr按月份顺序预计算每个月的累计销售额,再在交叉表中引用这个结果:
Sum(Aggr(RangeSum(Above(Sum(Sales), 0, RowNo())), (month, (Numeric, Ascending))))
关键说明
(month, (Numeric, Ascending)):强制按月份的数值顺序排序(确保时间逻辑正确,避免字符串排序导致的顺序混乱)Aggr内部的RangeSum(Above(...))在聚合的行集中计算累计,再通过外层Sum适配交叉表的列维度展示
方法2:基于ColumnNo的列累计计算
如果交叉表的列严格按月份升序排列,可以直接利用列位置计算累计:
RangeSum(First(Sum(Sales), ColumnNo()))
关键说明
First(Sum(Sales), ColumnNo()):取从第一列到当前列的所有Sales值求和- 此方法依赖列的排序顺序,若月份列顺序变化,累计结果会出错,适合固定排序的场景
注意事项
- 确保
month字段已设置正确的排序规则(建议设为日期类型,或按数值排序) - 可先在普通表格中验证
Aggr计算的累计值是否正确,再应用到交叉表
内容的提问来源于stack exchange,提问作者Aidono
相关产品推荐
相关产品推荐

