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

SQL Server中如何按指定列汇总并避免该列重复输出?

解决方案

要实现同个Acc_no仅首行显示编号和计数、后续行留空的效果,核心是用**窗口函数ROW_NUMBER()**对每个Acc_no分组的行进行编号,再通过CASE语句控制列的显示内容。

步骤1:先保留你的原始关联逻辑

假设你的原始表关联查询大致如下(请根据实际表结构调整关联条件和字段):

SELECT 
    A.Acc_no,
    COUNT(D.VPN) OVER (PARTITION BY A.Acc_no) AS VPN_Count,
    D.VPN
FROM A
LEFT JOIN B ON A.id = B.a_id
INNER JOIN C ON B.id = C.b_id
LEFT JOIN D ON C.id = D.c_id
-- 可添加WHERE条件过滤特定数据,比如WHERE A.Acc_no = '12345678'
ORDER BY A.Acc_no, D.VPN;

这个查询会生成你当前看到的重复结果,接下来对其进行改造。

步骤2:添加行号判断并控制显示

在外层嵌套查询中,用ROW_NUMBER()给每个Acc_no组内的行分配序号,再通过CASE语句仅让组内第一行显示Acc_no和VPN_Count,后续行对应列留空:

SELECT
    CASE WHEN rn = 1 THEN Acc_no ELSE '' END AS Acc_no,
    CASE WHEN rn = 1 THEN VPN_Count ELSE '' END AS VPN_Count,
    VPN
FROM (
    SELECT 
        A.Acc_no,
        COUNT(D.VPN) OVER (PARTITION BY A.Acc_no) AS VPN_Count,
        D.VPN,
        -- 按Acc_no分组,组内按VPN排序(可按需调整排序字段)生成行号
        ROW_NUMBER() OVER (PARTITION BY A.Acc_no ORDER BY D.VPN) AS rn
    FROM A
    LEFT JOIN B ON A.id = B.a_id
    INNER JOIN C ON B.id = C.b_id
    LEFT JOIN D ON C.id = D.c_id
    -- 可添加WHERE条件
) AS temp_result
ORDER BY Acc_no, rn;

关键细节说明

  • ROW_NUMBER() OVER (PARTITION BY A.Acc_no ORDER BY D.VPN):按Acc_no分组,每组内按VPN排序(可替换成你需要的排序字段),给每行分配唯一序号rn。
  • CASE WHEN rn = 1 THEN ... ELSE '' END:仅组内第一行显示Acc_no和VPN_Count,后续行对应列留空。如果需要返回NULL而非空字符串,将''替换为NULL即可。
  • 若你的VPN_Count是通过GROUP BY聚合得到的,需调整内层查询逻辑,确保VPN_Count在同一Acc_no组内保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:22:38