SQLSERVER中的ListAGG

use*_*642 65 sql sql-server aggregate

我正在尝试聚合SQLServer中的"STRING"字段.我想在Oracle中找到与LISTAGG相同的功能.

你知道如何做同样的功能或另一种方法吗?

例如,

Field A | Field B
1       |  A
1       |  B
2       |  A
Run Code Online (Sandbox Code Playgroud)

我想这个查询的结果将是

1 | AB
2 | A
Run Code Online (Sandbox Code Playgroud)

Man*_*mar 128

MySQL的

SELECT FieldA
     , GROUP_CONCAT(FieldB ORDER BY FieldB SEPARATOR ',') AS FieldBs
  FROM TableName
 GROUP BY FieldA
 ORDER BY FieldA;
Run Code Online (Sandbox Code Playgroud)

Oracle和DB2

SELECT FieldA
     , LISTAGG(FieldB, ',') WITHIN GROUP (ORDER BY FieldB) AS FieldBs
  FROM TableName
 GROUP BY FieldA
 ORDER BY FieldA;
Run Code Online (Sandbox Code Playgroud)

PostgreSQL的

SELECT FieldA
     , STRING_AGG(FieldB, ',' ORDER BY FieldB) AS FieldBs
  FROM TableName
 GROUP BY FieldA
 ORDER BY FieldA;
Run Code Online (Sandbox Code Playgroud)

SQL Server

SQLServer≥2017和Azure SQL

SELECT FieldA
     , STRING_AGG(FieldB, ',') WITHIN GROUP (ORDER BY FieldB) AS FieldBs
  FROM TableName
 GROUP BY FieldA
 ORDER BY FieldA;
Run Code Online (Sandbox Code Playgroud)

SQLServer≤2016(包括CTE以鼓励DRY原则)

  WITH CTE_TableName AS (
       SELECT FieldA, FieldB
         FROM TableName)
SELECT t0.FieldA
     , STUFF((
       SELECT ',' + t1.FieldB
         FROM CTE_TableName t1
        WHERE t1.FieldA = t0.FieldA
        ORDER BY t1.FieldB
          FOR XML PATH('')), 1, LEN(','), '') AS FieldBs
  FROM CTE_TableName t0
 GROUP BY t0.FieldA
 ORDER BY FieldA;
Run Code Online (Sandbox Code Playgroud)

SQLite的

订购需要CTE或子查询

  WITH CTE_TableName AS (
       SELECT FieldA, FieldB
         FROM TableName
        ORDER BY FieldA, FieldB)
SELECT FieldA
     , GROUP_CONCAT(FieldB, ',') AS FieldBs
  FROM CTE_TableName
 GROUP BY FieldA
 ORDER BY FieldA;
Run Code Online (Sandbox Code Playgroud)

没有订购

SELECT FieldA
     , GROUP_CONCAT(FieldB, ',') AS FieldBs
  FROM TableName
 GROUP BY FieldA
 ORDER BY FieldA;
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案 - 比标记的答案更简洁+也提到其他sql方言.这个sqlserver语法真的不直观.我也很惊讶选择内容的额外括号是必要的. (4认同)

Tar*_*ryn 62

在SQL Server中,您可以使用FOR XML PATH获取结果:

select distinct t1.FieldA,
  STUFF((SELECT distinct '' + t2.FieldB
         from yourtable t2
         where t1.FieldA = t2.FieldA
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,0,'') data
from yourtable t1;
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

  • @ user1557642您可以使用`ORDER BY`,您只需在子查询中包含`GROUP BY`,请参阅此演示 - http://www.sqlfiddle.com/#!3/0836c/7 (3认同)

vld*_*jcc 20

在SQL Server 2017 中添加了STRING_AGG:

SELECT t.name,STRING_AGG (c.name, ',') AS csv
FROM sys.tables t
JOIN sys.columns c on t.object_id = c.object_id
GROUP BY t.name
ORDER BY 1
Run Code Online (Sandbox Code Playgroud)

此外,STRING_SPLIT对于相反的情况很有用,并且在SQL Server 2016中可用

  • 注意:vNext已命名为SQL Server 2017 (4认同)
  • STRING_AGG/STRING_SPLIT最近也被添加到Azure SQL数据库中,也适用于碰巧在该平台上登陆的任何人. (2认同)