SQL 服务器中的冒号分隔列表(如 LISTAGG)
Colon Separated List in SQL Server (Like LISTAGG)
我希望根据如下结果在 SQL 服务器中生成一个连接字符串:
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 函数和这篇文章 How do I Create a Comma-Separated List using a SQL Query?,但我似乎没有正确地解决它。
如有任何帮助,我们将不胜感激!
编辑:
这是我尝试过的,结果是所有 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
.
您 do 需要子查询中的 WHERE
条件来关联外部查询行中的 Acct
值要在内部查询中连接的值的子集。
您需要在外部查询中的 SELECT
之后添加 DISTINCT
,因为 TableA 会重复这些值。
为了可读性和减少可能难以调试的奇怪行为,您不应在子查询中重复使用 table 别名。如果您是从 TableA 重新 select,而不是使用来自外部查询的 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
我希望根据如下结果在 SQL 服务器中生成一个连接字符串:
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 函数和这篇文章 How do I Create a Comma-Separated List using a SQL Query?,但我似乎没有正确地解决它。
如有任何帮助,我们将不胜感激!
编辑:
这是我尝试过的,结果是所有 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
.您 do 需要子查询中的
WHERE
条件来关联外部查询行中的Acct
值要在内部查询中连接的值的子集。您需要在外部查询中的
SELECT
之后添加DISTINCT
,因为 TableA 会重复这些值。为了可读性和减少可能难以调试的奇怪行为,您不应在子查询中重复使用 table 别名。如果您是从 TableA 重新 select,而不是使用来自外部查询的 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