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

SQL主键聚合查询:双表关联实现消费者维度商品统计需求

解决方案:关联双表实现消费者维度的统计

嘿,作为SQL初学者,遇到多表关联统计的问题太正常了,我来一步步帮你搞定这个需求!

首先咱们先理清楚两张表的关系:

  • 表1(我暂时叫它product_consumer,你记得换成实际表名):每个PRODUCT_ID是唯一主键,一条记录对应一个产品和它所属的消费者
  • 表2(暂时叫product_shipping):同一个PRODUCT_ID有多条记录,记录产品的发货、退回状态

咱们的目标是按消费者分组,统计每个消费者的:

  1. 拥有的产品总数(TOTAL_PRODUCTS)
  2. 所有产品的总发货量(TOTAL_SENT)
  3. 所有产品的总退回量(TOTAL_RETURNED)

第一步:先处理表2的重复数据

因为表2里PRODUCT_ID有重复,咱们得先按PRODUCT_ID分组,算出每个产品的累计发货和退回量,避免直接关联时统计数据翻倍/出错:

SELECT 
    PRODUCT_ID,
    SUM(SENT) AS total_sent_per_product,
    SUM(RETURNED) AS total_returned_per_product
FROM product_shipping
GROUP BY PRODUCT_ID

第二步:关联表1和处理后的表2,按消费者统计

把上面的子查询结果和表1关联,再按CONSUMER_ID分组汇总:

SELECT 
    pc.CONSUMER_ID,
    COUNT(pc.PRODUCT_ID) AS TOTAL_PRODUCTS,
    -- 用COALESCE处理没有物流记录的产品,把NULL转为0
    COALESCE(SUM(ps.total_sent_per_product), 0) AS TOTAL_SENT,
    COALESCE(SUM(ps.total_returned_per_product), 0) AS TOTAL_RETURNED
FROM product_consumer pc
-- 用LEFT JOIN确保即使产品没有物流记录也会被统计
LEFT JOIN (
    SELECT 
        PRODUCT_ID,
        SUM(SENT) AS total_sent_per_product,
        SUM(RETURNED) AS total_returned_per_product
    FROM product_shipping
    GROUP BY PRODUCT_ID
) ps ON pc.PRODUCT_ID = ps.PRODUCT_ID
GROUP BY pc.CONSUMER_ID

关键细节解释

  • 为什么用子查询处理表2? 如果直接把表1和原始表2关联,表2的重复PRODUCT_ID会让表1的产品记录被重复计算,导致TOTAL_PRODUCTS的数值错误(比如一个产品在表2有3条记录,直接关联后会被统计3次)。先分组统计每个产品的合计值,就能避免这个问题。
  • LEFT JOIN的作用? 确保那些还没有物流记录的产品也能被包含在统计里,不会因为表2没有对应记录就被排除。
  • COALESCE函数? 当某个产品没有物流记录时,SUM(ps.total_sent_per_product)会返回NULL,用COALESCE把它转换成0,统计结果更直观准确。

记得把代码里的product_consumer和product_shipping换成你实际的表名哦!

内容的提问来源于stack exchange,提问作者Umair Shahid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:27:32