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

SQL子查询连接与求和:合并去重及汇总查询需求

合并去重与汇总后的SQL表连接方案

我来帮你梳理下这个需求的实现思路哈,核心就是先分别完成两个表的预处理(Table1去重、Table2按ID汇总消费),再把处理后的结果通过ID字段关联起来。下面给你两种常用的实现方式:

方式一:使用CTE(公共表表达式)更清晰

这种方式把两个表的预处理逻辑分开写,可读性更强:

WITH Deduplicated_Table1 AS (
    -- 对Table1去重,保留唯一的ID及其他字段
    SELECT DISTINCT *
    FROM Table1
),
Aggregated_Table2 AS (
    -- 对Table2按ID分组,汇总dollarspent
    SELECT 
        ID,
        SUM(dollarspent) AS total_dollarspent
    FROM Table2
    GROUP BY ID
)
-- 基于ID连接两个预处理后的表
SELECT 
    dt1.*,
    at2.total_dollarspent
FROM Deduplicated_Table1 dt1
LEFT JOIN Aggregated_Table2 at2 ON dt1.ID = at2.ID;

方式二:子查询嵌套实现

如果你的数据库版本不支持CTE,也可以用子查询直接嵌套:

SELECT 
    dt1.*,
    at2.total_dollarspent
FROM (
    -- 子查询实现Table1去重
    SELECT DISTINCT *
    FROM Table1
) dt1
LEFT JOIN (
    -- 子查询实现Table2按ID汇总
    SELECT 
        ID,
        SUM(dollarspent) AS total_dollarspent
    FROM Table2
    GROUP BY ID
) at2 ON dt1.ID = at2.ID;

关键细节说明

  • 关于连接类型:上面用的是LEFT JOIN(左连接),会保留所有去重后的Table1行,如果Table2中没有对应ID的记录,total_dollarspent会显示为NULL。如果只需要保留两表都存在的ID,可以把LEFT JOIN改成INNER JOIN(内连接)。
  • Table1去重的替代方案:如果Table1的重复行是因为ID重复(其他字段也一致),用SELECT DISTINCT *没问题;如果ID相同但其他字段有差异,你可能需要用GROUP BY ID并配合聚合函数(比如MAX()/MIN())来选择保留哪一行数据。
  • 汇总准确性:SUM(dollarspent)会自动忽略NULL值,所以如果Table2中某些ID的dollarspent有NULL,不影响最终汇总结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:12:47