#1 の例
DECLARE @t TABLE (EmpId INT, EmpName VARCHAR(100)) INSERT @t VALUES (1, 'Mary'),(1, 'John'),(1, 'Sam'),(2, 'Alaina'),(2, 'Edward') SELECT distinct EmpId, ( SELECT EmpName+',' FROM @t t2 WHERE t2.EmpId = t1.EmpId FOR XML PATH('') ) Concatenated FROM @t t1
プレ>最後のコンマを削除する方法 - 独自のものです
#2 の CLR 集計 c# コード
using System; using System.Collections.Generic; using System.Data.SqlTypes; using System.Text; using Microsoft.SqlServer.Server; using System.IO; namespace DatabaseAssembly { [Serializable] [SqlUserDefinedAggregate(Format.UserDefined, IsInvariantToNulls = true, IsInvariantToDuplicates = true, IsInvariantToOrder = true, MaxByteSize = -1)] public struct StringJoin : IBinarySerialize { private Dictionary<string, string> AggregationList { get { if (_list == null) _list = new Dictionary<string, string>(); return _list; } } private Dictionary<string, string> _list; public void Init() { } public void Accumulate(SqlString Value) { if (!Value.IsNull) AggregationList[Value.Value.ToLowerInvariant()] = Value.Value; } public void Merge(StringJoin Group) { foreach (var key in Group.AggregationList.Keys) AggregationList[key] = Group.AggregationList[key]; } public SqlChars Terminate() { var sb = new StringBuilder(); foreach (var value in AggregationList.Values) sb.Append(value); return new SqlChars(sb.ToString()); } #region IBinarySerialize Members public void Read(System.IO.BinaryReader r) { try { while (true) AggregationList[r.ReadString()] = r.ReadString(); } catch (EndOfStreamException) { } } public void Write(System.IO.BinaryWriter w) { foreach (var key in AggregationList.Keys) { w.Write(key); w.Write(AggregationList[key]); } } #endregion } }
プレ>