sql >> データベース >  >> RDS >> Sqlserver

SQL Server の SQL group_concat 関数

    <オール>
  1. XML パスの場合 トリック および 記事
  2. CLR ユーザー定義集計
  3. バージョン 2005 より前の SQL Server の場合 - 一時テーブル
  4. #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
        }
    }
      

    1. 結合を追加するMySqlは誤った結果をもたらします

    2. sqlは一意のテーブル/ビュー名を生成します

    3. SequelizeモデルでPostgresで生成された列を使用する

    4. mysqlで次の自動インクリメントIDを取得する方法