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

如何将同acc_no的统计数作为新列生成目标SQL表

解决方案:将acc_no的总计数映射到每行数据

方法一:使用窗口函数(推荐,简洁高效)

直接利用窗口函数COUNT() OVER(),无需额外关联表,就能为每个acc_no的行填充对应的总行数:

SELECT 
    a.acc_no,
    a.id,
    COUNT(*) OVER (PARTITION BY a.acc_no) AS total_num,
    b.status
FROM table1 a
INNER JOIN table2 b
    ON a.sid = b.sid
WHERE b.type = 'SMT'
    AND b.status = 'Active'
ORDER BY a.acc_no, a.sid, a.dt DESC;

说明:

  • COUNT(*) OVER (PARTITION BY a.acc_no)会把相同acc_no的行划分为一个分组,计算该分组的总行数,并将数值填充到分组内的每一行,正好满足total_num列的需求。
  • 保留了你原查询的排序逻辑,确保结果顺序符合预期。

方法二:子查询关联(兼容不支持窗口函数的老版本SQL)

如果你的数据库版本不支持窗口函数(如MySQL 5.7及更早版本),可以用子查询关联的方式实现:

SELECT 
    base.acc_no,
    base.id,
    cnt.cou AS total_num,
    base.status
FROM (
    -- 获取基础关联数据
    SELECT a.acc_no, a.id, b.status
    FROM table1 a
    INNER JOIN table2 b
        ON a.sid = b.sid
    WHERE b.type = 'SMT'
        AND b.status = 'Active'
) AS base
-- 关联acc_no的统计结果
INNER JOIN (
    SELECT cnt.acc_no, COUNT(1) AS cou 
    FROM (
        SELECT a.acc_no
        FROM table1 a
        INNER JOIN table2 b
            ON a.sid = b.sid
        WHERE b.type = 'SMT'
            AND b.status = 'Active'
    ) AS cnt
    GROUP BY cnt.acc_no
) AS cnt ON base.acc_no = cnt.acc_no
ORDER BY base.acc_no, base.id;

说明:

  • 先通过base子查询取出所有符合条件的行数据,再通过cnt子查询统计每个acc_no的总行数,最后通过acc_no字段关联两个子查询,将计数填充到对应行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:02:29