SQL Server 在SQLSERVER中列出AGG

h6my8fg2  于 2022-11-21  发布在  其他
关注(0)|答案(4)|浏览(188)

我试图在SQL Server中聚合一个“STRING”字段。我想找到与Oracle中相同的函数LISTAGG。
你知道如何做同样的功能或另一种方法吗?
例如,

Field A | Field B
1       |  A
1       |  B
2       |  A

我希望这个查询的结果是

zour9fqk

zour9fqk1#

MySQL数据库

SELECT FieldA
     , GROUP_CONCAT(FieldB ORDER BY FieldB SEPARATOR ',') AS FieldBs
  FROM TableName
 GROUP BY FieldA
 ORDER BY FieldA;

Oracle和 db2

SELECT FieldA
     , LISTAGG(FieldB, ',') WITHIN GROUP (ORDER BY FieldB) AS FieldBs
  FROM TableName
 GROUP BY FieldA
 ORDER BY FieldA;

PostgreSQL数据库

SELECT FieldA
     , STRING_AGG(FieldB, ',' ORDER BY FieldB) AS FieldBs
  FROM TableName
 GROUP BY FieldA
 ORDER BY FieldA;

SQL服务器

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以鼓励DRY principle

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;
lztngnrs

lztngnrs2#

SQL Server 2017开始,可以使用STRING_AGG函数,这大大简化了逻辑:

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

查看SQL Fiddle演示
在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;

查看SQL Fiddle演示

ufj5ltwl

ufj5ltwl3#

在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

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

a8jjtwal

a8jjtwal4#

这可能对某些人也很有用,例如,用于数据分析和数据概要类型的目的。(例如,不按分组)。
在SQL Server 2017 STRING_AGG之前,函数已存在。
(i.e.仅返回一行..)

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

它返回逗号分隔的值-例如“A,B”。

相关问题