2013-03-18 35 views
45

SQLServerで 'STRING'フィールドを集計しようとしています。私はOracleのようなLISTAGGと同じ機能を探したい。SQLSERVERのListAGG

同じ機能や別の方法を知っていますか?例については

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

そして私は、このクエリの結果は、あなたが結果を得るためにFOR XML PATHを使用することができますSQL Serverで

1 | AB 
2 | A 

答えて

43

になることを希望:

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 with Demo

SQLSERVERで
+0

で逆の場合のために便利であり、使用可能です!!!!あなたのお手伝いに多くのご協力ありがとうございます。 – user1557642

+0

サブセレクションにorder by句を挿入したいと思います。この句を挿入する方法を知っていますか? – user1557642

+0

@ user1557642何を注文しますか?値を逆にしますか?あなたは簡単に 'ORDER BY'を追加することができます - このデモを見る - http://www.sqlfiddle.com/#!3/0836c/7。この場合、 'FieldA'の結果は' BA' – Taryn

66

SELECT FieldA , STUFF((SELECT ','+ FieldB FROM TableName a 
WHERE b.FieldA = a.FieldA FOR XML PATH('')),1 ,1, '') Members 
FROM TableName b 
GROUP BY FieldA; 

MySQLでは:オラクルで

SELECT FieldA, GROUP_CONCAT(FieldB) AS Members 
FROM TableName 
GROUP BY FieldA 
ORDER BY FieldA; 

:SQL Serverで

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

すばらしい答え - マークされた答えよりも少し簡潔です+他のSQL方言も言及しています。このためのsqlserverの構文は本当に直感的ではありません。私はまた、選択肢の周りの余分な括弧が必要であることに驚いた。 –

+0

@manas_kumarしかし...なぜSTUFFを使用していますか?それは不要です。何か不足していますか? –

+0

@Ricardo_C STUFFは、先頭のコンマを削除するためにここで使用されています。 – DigitalDan

16

2017​​が追加されます。

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はそれがworksssssssssssのSQL Server 2016

+2

STRING_AGG/STRING_SPLITも最近Azure SQLデータベースに追加されました。 –

+3

注:vNextにはSQL Serverという名前が付けられています。2017 –

+0

異なるc.nameを使用する方法を知っていますか。すべての連結名は一意ですか? –