it-swarm.com.de

ListAGG in SQLSERVER

Ich versuche, ein 'STRING'-Feld in SQLServer zusammenzufassen. Ich möchte die gleiche Funktion LISTAGG wie in Oracle finden.

Wissen Sie, wie Sie dieselbe Funktion oder eine andere Methode ausführen?

Zum Beispiel,

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

Und ich möchte, dass das Ergebnis dieser Abfrage sein wird 

1 | AB
2 | A
55
user1557642

In SQL Server können Sie FOR XML PATH verwenden, um das Ergebnis zu erhalten:

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;

Siehe SQL Fiddle mit Demo

53
Taryn

MySQL

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

Oracle und 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 Server

SQL Server ≥ 2017 und 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 zur Unterstützung des Prinzips 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;

SQLite

Bestellung erfordert einen CTE oder eine Unterabfrage

  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;

Ohne Bestellung

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

In SQL Server 2017 wird STRING_AGG hinzugefügt:

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 ist auch für den umgekehrten Fall nützlich und in SQL Server 2016 verfügbar

19
vldmrrdjcc

Dies könnte auch für jemanden nützlich sein ..

d. h. für einen Datenanalysten und Datenprofilierungstypen (d. h. nicht gruppiert nach) ..

Vor der Existenz der SQL * Server 2017-Funktion String_agg ..

(d. h. gibt nur eine Zeile zurück.)

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 

z.B. gibt durch Kommas getrennte Werte zurück .__, A, B

0
Allan F