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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:25:22