una texto separar separada registros por partes numeros hacer extraer desconcatenar con comas columnas cadenas cadena sql sql-server sql-server-2008 tsql

sql - texto - ¿Puedo delimitar coma varias filas en una columna?



separar texto en columnas oracle (5)

Aquí hay una solución que funciona en SQL Server 2005+:

SELECT t.TicketID, STUFF(ISNULL((SELECT '', '' + x.Person FROM @Tickets x WHERE x.TicketID = t.TicketID GROUP BY x.Person FOR XML PATH (''''), TYPE).value(''.'',''VARCHAR(max)''), ''''), 1, 2, '''') [No Preceeding Comma], ISNULL((SELECT '', '' + x.Person FROM @Tickets x WHERE x.TicketID = t.TicketID GROUP BY x.Person FOR XML PATH (''''), TYPE).value(''.'',''VARCHAR(max)''), '''') [Preceeding Comma If Not Empty] FROM @Tickets t GROUP BY t.TicketID

Referencia:

Estoy intentando fusionar algo como esto en mi base de datos de SQL Server:

[TicketID], [Person] T0001 Alice T0001 Bob T0002 Catherine T0002 Doug T0003 Elaine

Dentro de esto:

[TicketID], [People] T0001 Alice, Bob T0002 Catherine, Doug T0003 Elaine

Necesito hacer esto tanto en SQL Server como en Oracle.

Encontré la función GROUP_CONCAT para MySQL que hace exactamente lo que necesito aquí, pero MySQL no es una opción aquí.

EDITAR: Banco de pruebas:

DECLARE @Tickets TABLE ( [TicketID] char(5) NOT NULL, [Person] nvarchar(15) NOT NULL ) INSERT INTO @Tickets VALUES (''T0001'', ''Alice''), (''T0001'', ''Bob''), (''T0002'', ''Catherine''), (''T0002'', ''Doug''), (''T0003'', ''Elaine'') SELECT * FROM @Tickets


He encontrado una manera de hacer esto en Oracle, pero aún tengo que hacerlo en SQL Server.

De http://technology.amis.nl/blog/6118/oracle-rdbms-11gr2-listagg-new-aggregation-operator-for-creating-comma-delimited-strings (Thanks tanging ) (ORACLE 11 en adelante)

select TicketId, listagg(Person, '', '') People from table group by TicketId

De: http://halisway.blogspot.com/2006/08/oracle-groupconcat-updated-again.html

with data as ( select TicketId, Person, ROW_NUMBER() over (partition by TicketId order by Person) "rownum", COUNT(*) over (partition by TicketId) "count" from Table ) select TicketId, LTRIM(sys_connect_by_path(Person,'',''),'','') People from data where "rownum" = "count" start with "rownum" = 1 connect by prior TicketId = TicketId and prior "rownum" = "rownum" - 1 order by TicketId


Y, la versión de MySQL, para completar:

select TicketId, GROUP_CONCAT(Person ORDER BY Person SEPARATOR '', '') People from table group by TicketId


un ejemplo

SELECT DISTINCT t.TicketID, STUFF((SELECT '', '', i.Person as [text()] FROM @Tickets i WHERE i.TicketID = t.TicketID FOR XML PATH ('''')), 1, 2, '''') as People FROM @Tickets t

......... o tratar ..............

SELECT DISTINCT t.TicketID, STUFF((SELECT '', '' + i.Person /* notice this line is different */ FROM @Tickets i WHERE i.TicketID = t.TicketID FOR XML PATH ('''')), 1, 2, '''') as People FROM @Tickets t

/ * esto funciona cuando utilicé esto para mi mesa y el mérito es para mi gerente que ROCKS! * /


DECLARE @Tickets TABLE ( [TicketID] char(5) NOT NULL, [Person] nvarchar(15) NOT NULL ) INSERT INTO @Tickets VALUES (''T0001'', ''Alice''), (''T0001'', ''Bob''), (''T0002'', ''Catherine''), (''T0002'', ''Doug''), (''T0003'', ''Elaine'') SELECT * FROM @Tickets Select [TicketID], STUFF((SELECT '','' + Person FROM @Tickets WHERE ( TicketID=Result.TicketID) FOR XML PATH ('''')),1,1,'''') AS BATCHNOLIST From @Tickets AS Result GROUP BY TicketID