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

求助:合并Tb_Requests与TB_Offers计数查询,实现产品关联统计

解决SQL多表计数匹配问题

你原来的查询错误在于直接关联三个表产生了笛卡尔积,导致Tb_Requests和TB_Offers的记录交叉相乘,最终两个计数结果被错误放大且数值相同。比如某产品有3条请求、2条报价,交叉后会生成6条记录,因此两个count都会返回6,和实际数据不符。

正确的做法是先分别统计每个产品的报价数和请求数,再将统计结果与产品表关联,避免交叉计数:

SELECT 
    p.[Name],
    COALESCE(offer_counts.[# of Offers], 0) AS '# of Offers',
    COALESCE(request_counts.[# of Requests], 0) AS '# of Requests'
FROM Tb_Product p
LEFT JOIN (
    -- 预统计每个产品的报价记录数
    SELECT Prod_ID, COUNT(Supp_ID) AS '# of Offers'
    FROM TB_Offers
    GROUP BY Prod_ID
) offer_counts ON p.Prod_ID = offer_counts.Prod_ID
LEFT JOIN (
    -- 预统计每个产品的请求记录数
    SELECT Prod_ID, COUNT(Con_ID) AS '# of Requests'
    FROM Tb_Requests
    GROUP BY Prod_ID
) request_counts ON p.Prod_ID = request_counts.Prod_ID;

关键说明:

  • 两个子查询分别独立统计报价和请求的数量,避免了表关联时的交叉相乘问题
  • 使用LEFT JOIN确保所有产品都能被列出,哪怕该产品没有对应的报价或请求记录
  • COALESCE函数将NULL值替换为0,让没有记录的产品计数显示为0,结果更直观

如果只需要显示有报价或请求的产品,可将LEFT JOIN替换为INNER JOIN。

内容的提问来源于stack exchange,提问作者5h34rcon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:30:52