Qlikview基于数据中distinct日期循环实现各产品每日累计销量展示
该需求完全可以在QlikView中实现,无需手动遍历日期做循环计算,可通过脚本预处理或前端表达式两种方式完成,具体实现逻辑如下:
实现方式1:脚本预处理生成结果表
适合需要将累计结果固化到数据模型、供后续多处调用的场景,代码示例如下:
// 1. 加载原始销售数据,注意将字符串格式的日期转换为QlikView可识别的日期类型 Sales: LOAD Date#(Date, 'DD/MM/YYYY') AS Date, // 日期格式请根据实际数据源调整 Product, Sold FROM [你的实际数据源文件路径]; // 2. 提取所有业务日期并按升序排序 AllDates: LOAD DISTINCT Date RESIDENT Sales ORDER BY Date ASC; // 3. 生成每个日期节点对应的所有已出现产品的累计销量 FinalResult: LOAD Date, Product, Rangesum(Above(Sum(Sold), 0, RowNo())) AS CumulativeSold RESIDENT ( // 关联得到「每个日期 + 所有在该日期前已上线的产品」组合,无销量则补0 SELECT a.Date, b.Product, If(IsNull(c.Sold), 0, c.Sold) AS Sold FROM AllDates a LEFT JOIN (SELECT DISTINCT Product, Min(Date) AS FirstAppearDate FROM Sales GROUP BY Product) b ON a.Date >= b.FirstAppearDate LEFT JOIN Sales c ON a.Date = c.Date AND b.Product = c.Product ) GROUP BY Date, Product ORDER BY Product, Date ASC; // 清理临时表释放内存 DROP TABLE Sales, AllDates;
实现方式2:前端图表直接计算
适合灵活查询、不需要固化累计结果的场景,操作步骤如下:
- 新建直表对象,添加2个维度:
- Date:设置按升序排序
- Product:设置按升序排序,勾选维度配置项中的「显示所有值」
- 添加度量表达式:
Rangesum(Above(total <Product> Sum(Sold), 0, RowNo(total <Product>)))
两种实现方式输出的结果均和你提供的期望输出完全匹配,每个日期节点会自动补全所有已出现过的产品,销量为截止到当前日期的累计值。
内容的提问来源于stack exchange,提问作者JonJon
相关产品推荐
相关产品推荐

