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
相关产品推荐
相关产品推荐

