SQLServerの「STRING」フィールドを集約しようとしています。Oracleと同じ関数LISTAGGを見つけたいと思います。
同じ機能または別の方法を実行する方法を知っていますか?
例えば、
Field A | Field B
1 | A
1 | B
2 | A
そして、私はこのクエリの結果が
1 | AB
2 | A
SQLServerの「STRING」フィールドを集約しようとしています。Oracleと同じ関数LISTAGGを見つけたいと思います。
同じ機能または別の方法を実行する方法を知っていますか?
例えば、
Field A | Field B
1 | A
1 | B
2 | A
そして、私はこのクエリの結果が
1 | AB
2 | A
SELECT FieldA
, GROUP_CONCAT(FieldB ORDER BY FieldB SEPARATOR ',') AS FieldBs
FROM TableName
GROUP BY FieldA
ORDER BY FieldA;
SELECT FieldA
, LISTAGG(FieldB, ',') WITHIN GROUP (ORDER BY FieldB) AS FieldBs
FROM TableName
GROUP BY FieldA
ORDER BY FieldA;
SELECT FieldA
, STRING_AGG(FieldB, ',' ORDER BY FieldB) AS FieldBs
FROM TableName
GROUP BY FieldA
ORDER BY FieldA;
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;
注文には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以降、ロジックを大幅に簡素化する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を参照してください
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で使用できます
これは誰かにも役立つかもしれません..
すなわち、データアナリストおよびデータプロファイリングタイプの目的のために..(すなわち、グループ化されていない)..
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を返します