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

如何在SQL Server中用SUM函数统计多表重复记录总数

解决SQL Server多表重复记录总数统计问题

首先得明确你想要统计的是哪种“重复记录数”,这也是你之前脚本得到错误结果的核心原因:

情况1:统计所有存在重复的记录总行数(即你最初查询返回的4+2+0+0+2=8这类结果)

你最初的脚本逻辑其实是对的,但可能因为对子查询返回值的理解偏差导致结果不符。我们可以调整脚本,先单独计算每个表的重复总行数,再汇总,这样更清晰:

SELECT SUM(total_duplicate_rows) AS GrandTotal
FROM (
    -- 订阅者表:所有重复记录的总行数
    SELECT SUM(dup_count) AS total_duplicate_rows
    FROM (
        SELECT COUNT(*) AS dup_count
        FROM tbl_Subscribers
        WHERE user_id='1' AND category_id='17'
        GROUP BY EmailAddress
        HAVING COUNT(*) > 1
    ) AS sub_dups
    UNION ALL
    -- 发件人表:所有重复记录的总行数
    SELECT SUM(dup_count) AS total_duplicate_rows
    FROM (
        SELECT COUNT(*) AS dup_count
        FROM tbl_From_master
        WHERE user_id='1'
        GROUP BY EmailAddress
        HAVING COUNT(*) > 1
    ) AS from_dups
    UNION ALL
    -- 分类表:所有重复记录的总行数
    SELECT SUM(dup_count) AS total_duplicate_rows
    FROM (
        SELECT COUNT(*) AS dup_count
        FROM tbl_Categories
        WHERE user_id='1'
        GROUP BY CategoryName
        HAVING COUNT(*) > 1
    ) AS cat_dups
    UNION ALL
    -- 模板分类表:所有重复记录的总行数
    SELECT SUM(dup_count) AS total_duplicate_rows
    FROM (
        SELECT COUNT(*) AS dup_count
        FROM tbl_Template_Categories
        WHERE user_id='1'
        GROUP BY CategoryName
        HAVING COUNT(*) > 1
    ) AS tcat_dups
    UNION ALL
    -- 模板表:所有重复记录的总行数
    SELECT SUM(dup_count) AS total_duplicate_rows
    FROM (
        SELECT COUNT(*) AS dup_count
        FROM tbl_Template_master
        WHERE user_id='1'
        GROUP BY TemplateName
        HAVING COUNT(*) > 1
    ) AS tpl_dups
) AS all_table_totals

这个脚本会先计算每个表中每个重复分组的记录数,求和得到该表的重复总行数,最后把所有表的结果加起来,和你最初查询返回的受影响行数总和一致。

情况2:统计真正的重复项数量(即每组中超出1条的部分,比如一个Email出现3次,重复数是2)

如果你想要的是“需要清理的重复记录数”(也就是每组去掉第一条后的数量),那要计算COUNT(*) - 1的总和,脚本如下:

SELECT SUM(duplicate_count) AS GrandTotal
FROM (
    -- 订阅者表:重复项数量
    SELECT (COUNT(*) - 1) AS duplicate_count
    FROM tbl_Subscribers
    WHERE user_id='1' AND category_id='17'
    GROUP BY EmailAddress
    HAVING COUNT(*) > 1
    UNION ALL
    -- 发件人表:重复项数量
    SELECT (COUNT(*) - 1) AS duplicate_count
    FROM tbl_From_master
    WHERE user_id='1'
    GROUP BY EmailAddress
    HAVING COUNT(*) > 1
    UNION ALL
    -- 分类表:重复项数量
    SELECT (COUNT(*) - 1) AS duplicate_count
    FROM tbl_Categories
    WHERE user_id='1'
    GROUP BY CategoryName
    HAVING COUNT(*) > 1
    UNION ALL
    -- 模板分类表:重复项数量
    SELECT (COUNT(*) - 1) AS duplicate_count
    FROM tbl_Template_Categories
    WHERE user_id='1'
    GROUP BY CategoryName
    HAVING COUNT(*) > 1
    UNION ALL
    -- 模板表:重复项数量
    SELECT (COUNT(*) - 1) AS duplicate_count
    FROM tbl_Template_master
    WHERE user_id='1'
    GROUP BY TemplateName
    HAVING COUNT(*) > 1
) AS all_duplicate_counts

为什么你之前得到错误结果?

你之前的脚本返回7,大概率是因为实际数据的重复分组情况和你预期的受影响行数不符。比如某个表的重复分组里有一个组是3条记录(COUNT(*)=3),另一个组是2条(COUNT(*)=2),那这两个组的和是5,加上其他表的2和2,总和就是9,和你预期的8不符。用上面第一种情况的脚本可以明确看到每个表的具体数值,方便排查数据问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:36:52