SQL主键聚合查询:双表关联实现消费者维度商品统计需求
解决方案:关联双表实现消费者维度的统计
嘿,作为SQL初学者,遇到多表关联统计的问题太正常了,我来一步步帮你搞定这个需求!
首先咱们先理清楚两张表的关系:
- 表1(我暂时叫它
product_consumer,你记得换成实际表名):每个PRODUCT_ID是唯一主键,一条记录对应一个产品和它所属的消费者 - 表2(暂时叫
product_shipping):同一个PRODUCT_ID有多条记录,记录产品的发货、退回状态
咱们的目标是按消费者分组,统计每个消费者的:
- 拥有的产品总数(
TOTAL_PRODUCTS) - 所有产品的总发货量(
TOTAL_SENT) - 所有产品的总退回量(
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
相关产品推荐
相关产品推荐

