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
  1. 你不需要 GROUP BY.

  2. do 需要子查询中的 WHERE 条件来关联外部查询行中的 Acct 值要在内部查询中连接的值的子集。

  3. 您需要在外部查询中的 SELECT 之后添加 DISTINCT,因为 TableA 会重复这些值。

  4. 为了可读性和减少可能难以调试的奇怪行为,您不应在子查询中重复使用 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