SQLSERVER中的ListAGG

SQLSERVER中的ListAGG,sql,sql-server,aggregate,Sql,Sql Server,Aggregate,我试图在SQLServer中聚合一个“字符串”字段。我想在Oracle中找到与Listag相同的函数 你知道如何做相同的功能或另一种方法吗 比如说, Field A | Field B 1 | A 1 | B 2 | A 我希望这个查询的结果是 1 | AB 2 | A 从STRING\u AGG功能开始,可大大简化逻辑: select FieldA, string_agg(FieldB, '') as data from yourtable gro

我试图在SQLServer中聚合一个“字符串”字段。我想在Oracle中找到与Listag相同的函数

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

比如说,

Field A | Field B
1       |  A
1       |  B
2       |  A
我希望这个查询的结果是

1 | AB
2 | A
STRING\u AGG
功能开始,可大大简化逻辑:

select FieldA, string_agg(FieldB, '') as data
from yourtable
group by FieldA

在SQL Server中,您可以对XML路径使用
来获得结果:

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;
请参见

MySQL Oracle和DB2 PostgreSQL SQL Server SQL Server≥ 2017和Azure SQL

SELECT FieldA
     , STRING_AGG(FieldB, ',') WITHIN GROUP (ORDER BY FieldB) AS FieldBs
  FROM TableName
 GROUP BY FieldA
 ORDER BY FieldA;
SQL Server≤ 2016年(包括CTE,以鼓励发展)

数据库 订购需要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;
无需订购

SELECT FieldA
     , GROUP_CONCAT(FieldB, ',') AS FieldBs
  FROM TableName
 GROUP BY FieldA
 ORDER BY FieldA;
SQL Server 2017中增加了:

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

此外,对于相反的情况也很有用,可在SQL Server 2016中使用。这可能对其他人也很有用

i、 e.用于数据分析和数据分析类型的目的…(即不按分组)

在SQL*Server 2017 String_agg函数存在之前

(即仅返回一行..)

e、 g.返回逗号分隔的值
A、 B

我想在子选择中插入order by子句。您知道如何插入此子句吗?@user1557642您想订购什么?是否要反转这些值?您可以通过查看此演示--,轻松添加一个
订单。在这种情况下,
FieldA
的结果将显示
BA
,事实上我有10行要聚合。但是SQLServer在降级之前做了字母排序。我想用我自己的参数(第三个字段)而不是字母顺序进行聚合。@user1557642如果您可以使用
排序依据
,只需在子查询中包含
分组依据
,请参阅此演示--使用特殊字符(如“great answer”-比标记的answer+更简洁一些)打断字符串,还提到了其他sql方言。这方面的sqlserver语法非常不直观。我还感到惊讶的是,select-in内容周围的额外括号是必要的。@manas_kumar但是。。。你为什么用这些东西?这是不必要的。我遗漏了什么吗?@Ricardo_C STUFF在这里用于删除前导逗号。为了完整起见,需要将其添加到sql server示例中:它防止某些字符被XML标记替换。@DanLenski似乎不是这样,因为我现在在另一个监视器上成功引用了
cte
,我可以想象你没有正确地构造查询?STRING_AGG/STRING_SPLIT最近也被添加到Azure SQL数据库中,也适用于在该平台上登陆的任何人。注意:vNext被命名为SQL Server 2017你知道如何使用不同的c.name,所以所有连接的名称都是唯一的?请添加您对DISTINCT的投票:
  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;
  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;
SELECT FieldA
     , GROUP_CONCAT(FieldB, ',') AS FieldBs
  FROM TableName
 GROUP BY FieldA
 ORDER BY FieldA;
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
select distinct
SUBSTRING (
stuff(( select distinct ',' + [FieldB] from tablename order by 1 FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 
,1,0,'' ) 
,2,9999)
from 
    tablename