如何合并单列多行数据?银行账户表SQL实现问题
解决重复账号客户名拼接问题
嘿,问题出在你的子查询没和外层的账号做关联!你原来的STUFF子查询没有过滤条件,所以会把全表的客户名都拼在一起返回,而不是对应每个账号的客户名。
先回顾你已经写好的重复账号查询,它已经正确找出了重复账号和重复次数:
SELECT k1.Account_number, COUNT(*) as Counter FROM Customers k1 GROUP BY k1.Account_number HAVING COUNT(*) > 1 ORDER BY Counter
要给每个账号加上对应的客户名称列表,只需要在STUFF的子查询里加上账号关联条件,让子查询只取当前外层行对应的账号的客户名就行。修改后的完整SQL如下:
SELECT k1.Account_number, COUNT(*) as Counter, STUFF( (SELECT '; ' + Customer_name FROM Customers k2 -- 关键:关联内层表和外层表的Account_number,确保只取当前账号的客户名 WHERE k2.Account_number = k1.Account_number FOR XML PATH('')), 1, 1, '' -- 去掉开头多余的"; " ) AS Customer_Names FROM Customers k1 GROUP BY k1.Account_number HAVING COUNT(*) > 1 ORDER BY Counter DESC;
为什么这样能行?
- 内层的
Customers k2和外层的Customers k1通过Account_number关联,每次外层遍历一个重复账号时,内层只会查询该账号对应的所有客户名称。 FOR XML PATH('')会把内层查询到的多个客户名拼接成一个以"; "分隔的字符串,比如张三; 李四; 王五。STUFF(...,1,1,'')用来去掉字符串开头的第一个"; ",让结果更整洁。
这样执行后,你就能得到每个重复账号的账号、重复次数,以及对应的所有客户名称列表啦!
内容的提问来源于stack exchange,提问作者n0rek
相关产品推荐
相关产品推荐

