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

如何在SQL中合并多组聚合查询生成含多计算字段的结果表

双聚合计算结果合并查询方案

不要直接将两个业务表同时关联grouped_users表做聚合——如果同一用户在两个业务表中都存在多条记录,直接关联会产生笛卡尔积,导致SUM计算结果虚高,推荐先分别完成两个维度的聚合计算,再按分组ID关联结果,写法兼容性最好、计算逻辑最准确。

推荐写法(支持CTE的数据库:MySQL8.0+、PostgreSQL、SQL Server等)

用CTE提前封装两个单计算的聚合逻辑,再按group_id关联,逻辑清晰易维护:

WITH res_calc1 AS (
    SELECT
        SUM(friends_made) AS calc1,
        table2.group_id
    FROM friends_made_table AS table1
    INNER JOIN grouped_users AS table2
        ON table1.user_id = table2.user_id
    GROUP BY table2.group_id
),
res_calc2 AS (
    SELECT
        SUM(request_accept) AS calc2,
        table1.group_id
    FROM friends_accept_table AS table3
    INNER JOIN grouped_users AS table1
        ON table1.user_id = table3.user_id
    GROUP BY table1.group_id
)
SELECT
    rc1.calc1,
    rc2.calc2,
    rc1.group_id
FROM res_calc1 rc1
INNER JOIN res_calc2 rc2
    ON rc1.group_id = rc2.group_id;

兼容低版本数据库写法(不支持CTE的场景)

直接把两个聚合逻辑作为子查询写在FROM子句中,效果和CTE写法完全一致:

SELECT
    c1.calc1,
    c2.calc2,
    c1.group_id
FROM (
    SELECT
        SUM(friends_made) AS calc1,
        table2.group_id
    FROM friends_made_table AS table1
    INNER JOIN grouped_users AS table2
        ON table1.user_id = table2.user_id
    GROUP BY table2.group_id
) c1
INNER JOIN (
    SELECT
        SUM(request_accept) AS calc2,
        table1.group_id
    FROM friends_accept_table AS table3
    INNER JOIN grouped_users AS table1
        ON table1.user_id = table3.user_id
    GROUP BY table1.group_id
) c2
ON c1.group_id = c2.group_id;

补充说明

示例中两个查询返回的group_id完全匹配,用INNER JOIN关联即可得到预期的目标结果。如果后续业务中存在某个分组ID只出现在其中一个计算结果里的场景,可以根据需求替换为LEFT JOIN/FULL JOIN保留对应侧的分组数据。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:12:23