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

SQL使用COUNT计算时保留全部记录的分组查询问题求助

解决方法:按row_sid均分amount和qty并保留所有行

你的问题核心在于:你需要保留所有关联展开的行,但同时要让每个row_sid下的所有行的amount和qty,除以该row_sid对应的总行数。GROUP BY之所以会丢失行,是因为它的作用是聚合分组,把同一组的行合并成一行,这和你要保留所有行的需求矛盾。

为什么之前的尝试有问题?

当你用GROUP BY row_sid时,虽然能计算出每个row_sid的行数,但聚合操作会把该row_sid下的多行合并成一行,自然就丢失了你需要的展开后的产品明细行。而如果去掉GROUP BY,你没办法直接获取每个row_sid对应的总行数来做除法,所以计算结果不对。

正确的解决方案:用窗口函数或子查询获取每个row_sid的行数

这里有两种可行的方法,根据你的MySQL版本选择:


方法1:使用窗口函数(MySQL 8.0及以上版本推荐)

窗口函数COUNT() OVER(PARTITION BY row_sid)可以在不聚合行的前提下,计算出每个row_sid对应的总行数。直接把这个值作为除数即可:

SELECT 
    s.row_sid,
    p.product_description,
    -- 均分amount,可通过ROUND()调整小数精度
    s.amount / COUNT(*) OVER(PARTITION BY s.row_sid) AS divided_amount,
    -- 均分qty
    s.qty / COUNT(*) OVER(PARTITION BY s.row_sid) AS divided_qty
FROM summary s
INNER JOIN list_header lh ON s.product_list_sid = lh.product_list_sid
INNER JOIN list_detail ld ON lh.product_list_sid = ld.product_list_sid
INNER JOIN product p ON ld.product_sid = p.product_sid;

方法2:使用子查询预计算行数(兼容MySQL 5.x版本)

如果你的MySQL版本不支持窗口函数,可以先通过子查询计算每个row_sid对应的总行数,再关联到原始查询中:

SELECT 
    s.row_sid,
    p.product_description,
    s.amount / row_count AS divided_amount,
    s.qty / row_count AS divided_qty
FROM summary s
-- 关联预计算的行数表
INNER JOIN (
    SELECT 
        s_inner.row_sid,
        COUNT(*) AS row_count
    FROM summary s_inner
    INNER JOIN list_header lh ON s_inner.product_list_sid = lh.product_list_sid
    INNER JOIN list_detail ld ON lh.product_list_sid = ld.product_list_sid
    GROUP BY s_inner.row_sid
) rc ON s.row_sid = rc.row_sid
-- 原来的关联逻辑不变
INNER JOIN list_header lh ON s.product_list_sid = lh.product_list_sid
INNER JOIN list_detail ld ON lh.product_list_sid = ld.product_list_sid
INNER JOIN product p ON ld.product_sid = p.product_sid;

结果验证

以你的测试数据为例:

  • row_sid=1和2对应的关联行数是3(product_list_sid=1的list_detail有3条)
  • row_sid=3对应的关联行数是4(product_list_sid=2的list_detail有4条)

修改后的查询会保留所有10行(row_sid1有3行,row_sid2有3行,row_sid3有4行),并且:

  • row_sid1的divided_amount=3/3=1,divided_qty=9/3=3
  • row_sid2的divided_amount=15/3=5,divided_qty=45/3=15
  • row_sid3的divided_amount=12/4=3,divided_qty=36/4=9

完全符合你的需求:保留所有原行,同时计算正确的均分后的值。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:50:40