我正在寻找从SQL Server中从以下结果类似的结果中产生一个串联字符串的方法:
Table A | Table B:
|
LOC Acct ID | ID SN
ATL 60 1 | 1 100A
ATL 60 2 | 2 300B
DAL 61 3 | 3 600X
DAL 61 4 | 4 500H
结果:
LOC Acct SN
ATL 60 100A:300B
DAL 61 600X:500H
我已经研究过使用STUFF函数和本文如何使用SQL查询创建逗号分隔的列表?,但我似乎无法正确解决。
任何帮助,将不胜感激!
编辑:
这是我尝试过的结果,结果是所有SN串联在一起的;我缺少了一些东西:
SELECT distinct
A2.LOC,
A2.Acct,
STUFF((SELECT ':'+ b.SN
FROM TableA a
JOIN TableB b ON b.ID = a.ID
GROUP BY a.acct
, b.sn
FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '') SN_List
FROM TableA a2
Results:
LOC Acct SN
ATL 60 100A:300B:500H:600X
ATL 60 100A:300B:500H:600X
DAL 61 100A:300B:500H:600X
DAL 61 100A:300B:500H:600X
您不需要GROUP BY
。
您确实需要WHERE
在子查询中创建一个条件,以Acct
将外部查询的行中的值与要在内部查询中连接的值的子集相关联。
您将需要在外部查询中的DISTINCT
后面添加,SELECT
因为TableA重复了这些值。
为了提高可读性并减少难以调试的奇怪行为,您不应在子查询中重复使用表别名。如果您从TableA重新选择,而不是使用外部查询的TableA中的行值,请使用类似的名称a2
代替相同的a
别名。
以下根据您的SqlFiddle起作用(对此答案的注释中指出):
SELECT DISTINCT
A2.LOC,
A2.Acct,
STUFF((SELECT ':'+ b.SN
FROM TableA a
INNER JOIN TableB b
ON b.ID = a.ID
WHERE a.Acct = a2.Acct
FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '') SN_List
FROM TableA a2
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句