Oracle/PLSQL去重查询:按ItemID和Category聚合值的实现问题
解决方案:PLSQL按ItemID聚合多分类值并去重
你的原查询因为按ItemID, Category分组,导致每个ItemID下不同Category会生成多行结果,而你需要每个ItemID一行展示所有分类的汇总。另外因为同一ItemID+Category下的Value恒定,我们可以先去重再聚合,避免重复计算。
方法1:先去重再聚合(使用DISTINCT子查询)
SELECT ItemID, SUM(CASE WHEN Category = 116113 THEN ROUND(Value,4) ELSE 0 END) AS "Summary_cat1", SUM(CASE WHEN Category = 222540 THEN ROUND(Value,4) ELSE 0 END) AS "Summary_cat2", SUM(CASE WHEN Category IN (116113,222540) THEN ROUND(Value,4) ELSE 0 END) AS "Summary_cat3" FROM ( -- 先去重,保留每个ItemID+Category的唯一行 SELECT DISTINCT ItemID, Category, Value FROM YOUR_TABLE_NAME ) deduplicated GROUP BY ItemID;
方法2:用窗口函数去重(适合大数据量场景)
如果数据量较大,窗口函数去重性能更优:
SELECT ItemID, SUM(CASE WHEN Category = 116113 THEN ROUND(Value,4) ELSE 0 END) AS "Summary_cat1", SUM(CASE WHEN Category = 222540 THEN ROUND(Value,4) ELSE 0 END) AS "Summary_cat2", SUM(CASE WHEN Category IN (116113,222540) THEN ROUND(Value,4) ELSE 0 END) AS "Summary_cat3" FROM ( SELECT ItemID, Category, Value, -- 给每个ItemID+Category的组标记第一行 ROW_NUMBER() OVER (PARTITION BY ItemID, Category ORDER BY SubitemID) AS rn FROM YOUR_TABLE_NAME ) deduplicated WHERE rn = 1 -- 只保留每组的第一行 GROUP BY ItemID;
关键说明:
- 去重逻辑:因为同一
ItemID+Category的Value恒定,所以先通过DISTINCT或窗口函数筛选出唯一行,避免同一分类的Value被重复累加。 - 分组调整:最终只按
ItemID分组,这样每个ItemID会生成一行结果,所有分类的汇总列都会展示在这一行。 - CASE WHEN汇总:保持你原有的条件判断逻辑,确保每个分类的Value被正确计算到对应的汇总列中。
内容的提问来源于stack exchange,提问作者J. Dragonic
相关产品推荐
相关产品推荐

