SQL Server中的冒号分隔列表(与LISTAGG一样)

时间:2015-02-13 15:38:26

标签: sql-server-2014

我希望从以下数据中生成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功能&这篇文章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 个答案:

答案 0 :(得分:0)

  1. 您不需要GROUP BY

  2. 执行在子查询中需要WHERE条件,以便将外部查询行中的Acct值与您想要的值的子集相关联在内部查询中连接。

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

  4. 为了便于阅读并减少难以调试的奇怪行为,不应在子查询中重复使用表别名。如果从TableA重新选择,而不是使用外部查询的TableA中的行值,请使用类似a2的内容而不是相同的a别名。

  5. 以下按照您的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