2011-01-25 5 views
1

у меня есть несколько таблиц, которые я вхожу вприсоединение две разные таблицы

organization table: 

id, name 

registration table: 

id, name 

после того, как я выполнить это, как она выглядит

org_id org_name  reg_name   reg_id 
-------------------------------------------------------- 
    329 abc   regname1  311  
    329 abc   regname2  298  

то, что я хочу сделать, это отобразить данные по одной строке например:

org_id org_name  reg_name     reg_id 
------------------------------------------------------------------------ 
    329 abc   regname1;regname2   311;298  

примечание: мое имя reg_name динамическое, оно может быть один или десять.

+1

После выполнения чего? Как связаны эти две таблицы? –

+0

http://stackoverflow.com/questions/273238/how-to-use-group-by-to-concatenate-strings-in-sql-server –

ответ

0

Что вы ищете, это SQLCLR custom aggregator. Затем вы использовали бы свой собственный агрегат, созданный вручную, таким же образом, как и для агрегатора SUM.

Грубого вырезать пользовательский агрегатор, который будет аккумулировать строки, сортировать их, а затем присоединиться к с запятой будет lõoke так:

[Serializable] 
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize=-1)] 
public struct JoinString : IBinarySerialize 
{ 
    List<String> strings; 
    public void Init() 
    { 
     strings = new List<String>(); 
    } 

    public void Accumulate(SqlString input) 
    { 
     strings.Add(input.Value); 
    } 

    public void Merge(JoinString Group) 
    { 
     strings.AddRange(Group.strings.ToArray()); 
    } 

    public SqlString Terminate() 
    { 
     strings.Sort(); 
     return new SqlString(String.Join(";", strings.ToArray())); 
    } 


    public void Read(System.IO.BinaryReader r) 
    { 
     int items = r.ReadInt32(); 
     strings = new List<String>(items); 
     for (var i = 0; i < items; i++) 
      strings.Add(r.ReadString()); 
    } 

    public void Write(System.IO.BinaryWriter w) 
    { 
     w.Write(strings.Count); 
     foreach (var s in strings) 
      w.Write(s); 
    } 
} 
+1

Это будет работать, пока порядок не важен. Если порядок важен, OP понадобится 'XML PATH' –

0

В Oracle вы также можете использовать функцию list_aggr. Например:

SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees 
FROM emp 
GROUP BY deptno; 

Ваш запрос должен как-то:

SELECT a.org_id,a.org_nam, LISTAGG(reg_name, ';') WITHIN GROUP (ORDER BY a.org_id) AS reg_name, LISTAGG(reg_id, ';') WITHIN GROUP (ORDER BY a.org_id) AS reg_id 
FROM organization a , registration b 
where b.org_id = a.org_id 
GROUP BY a.org_id,a.org_nam; 
Смежные вопросы