92

SQLServerの「STRING」フィールドを集約しようとしています。Oracleと同じ関数LISTAGGを見つけたいと思います。

同じ機能または別の方法を実行する方法を知っていますか?

例えば、

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

そして、私はこのクエリの結果が

1 | AB
2 | A
4

4 に答える 4

171

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サーバー

SQLServer≥2017&Azure SQL

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

SQLServer≤2016(DRY原則を奨励するために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;
于 2013-10-13T18:27:29.617 に答える
94

SQL Server 2017以降、ロジックを大幅に簡素化するSTRING_AGG関数が利用可能になりました。

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

SQL FiddlewithDemoを参照してください

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 FiddlewithDemoを参照してください

于 2013-03-18T13:18:54.880 に答える
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

また、STRING_SPLITは逆の場合に役立ち、SQLServer2016で使用できます

于 2017-01-05T15:30:42.507 に答える
2

これは誰かにも役立つかもしれません..

すなわち、データアナリストおよびデータプロファイリングタイプの目的のために..(すなわち、グループ化されていない)..

SQL * Server2017String_agg関数が存在する前..

(つまり、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 

たとえば、カンマ区切りの値A、Bを返します

于 2019-01-31T01:21:21.890 に答える