猿问

SQLSERVER中的ListAGG

SQLSERVER中的ListAGG

我试图在SQLSERVER中聚合一个“String”字段。我想找到与Oracle相同的LISTAGG函数。

您知道如何执行相同的功能或其他方法吗?

例如,

Field A | Field B1       |  A1       |  B2       |  A

我希望这个查询的结果是

1 | AB2 | A


撒科打诨
浏览 4036回答 3
3回答

慕哥9229398

在SQLServer中,可以使用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,'') datafrom yourtable t1;看见SQLFiddle与Demo

跃然一笑

MySQLSELECT FieldA     , GROUP_CONCAT(FieldB ORDER BY FieldB SEPARATOR ',') AS FieldBs  FROM TableName GROUP BY FieldA ORDER BY FieldA;Oracle&DB2SELECT FieldA     , LISTAGG(FieldB, ',') WITHIN GROUP (ORDER BY FieldB) AS FieldBs  FROM TableName GROUP BY FieldA ORDER BY FieldA;PostgreSQLSELECT FieldA     , STRING_AGG(FieldB, ',' ORDER BY FieldB) AS FieldBs  FROM TableName GROUP BY FieldA ORDER BY FieldA;SQLServerSQLServer≥2017&Azure SQLSELECT FieldA     , STRING_AGG(FieldB, ',') WITHIN GROUP (ORDER BY FieldB) AS FieldBs  FROM TableName GROUP BY FieldA ORDER BY FieldA;SQLServer≤2016(包括cte以鼓励干原理)  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;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;不订货SELECT FieldA     , GROUP_CONCAT(FieldB, ',') AS FieldBs  FROM TableName GROUP BY FieldA ORDER BY FieldA;
随时随地看视频慕课网APP
我要回答