En el foro
de SQL SERVER se cuestiona mucho como concatenar varias filas en una sola, sobre
todo esto se utiliza para evitar el uso de los cursores y es mucho más
rápido, para comenzar es necesario la tabla AdventureWorks2012.
1 
2 
 | SELECT TOP 10 FirstNameFROM AdventureWorks2012.Person.Person | 
Hasta aquí
no hay nada, digámoslo de cierta forma, nuevo, pero para poder hacer la
concatenación requerimos de la función STUFF y la clausula FOR XML utilizando el modo PATH.
La función
STUFF sirve para ingresar una cadena en otra a partir de los parámetros de
posición y longitud. Siendo de esta manera, el siguiente ejemplo:
1 
2 
 | SELECT TOP 10 FirstName, STUFF( FirstName, 3,2,'CADENA') as resultadoFROM AdventureWorks2012.Person.Person | 
Lo que nos
arroja como resultado:
Y para que
funciona FOR XML PATH, para devolver una consulta en
formato XML, este es el resultado de una consulta a la base de datos
AdventureWorks2012:
1 
2 
3 
 | SELECT TOP 3 FirstName, MiddleName, LastName LastNameFROM AdventureWorks2012.Person.PersonFOR XML PATH | 
Y si damos click al resultado, nos muestra esto:
Si agregamos el parámetro, reemplazara el atributo de fila:
1 
2 
3 
 | SELECT TOP 3 FirstName, MiddleName, LastName LastNameFROM AdventureWorks2012.Person.PersonFOR XML PATH('FILA') | 
Y que pasa si establecemos un valor vacío?:
Combinando STUFF y FOR XML PATH, podemos lograr concatenar
las filas.
1 
2 
3 
4 
5 
 | SELECT STUFF((       SELECT TOP 10 ','+FirstName       FROM AdventureWorks2012.Person.Person       FOR XML PATH('')),1,1, '') | 
Y de esta manera es posible agrupar a un nivel superior:
1 
2 
3 
4 
5 
6 
7 
8 
9 
 | SELECT       PC.Name       ,STUFF((             SELECT ','+name             FROM Production.ProductSubcategory PSC             WHERE PSC.ProductCategoryID = PC.ProductCategoryID             FOR XML PATH('')       ),1,1,'')FROM Production.ProductCategory PC | 
Algo más complejo, observemos las tablas Sales.SpecialOffer, Sales.SpecialOfferProduct,Production.Product, la primera contiene
las ofertas especiales( como su nombre lo indica), la segunda tabla contiene el
detallado de los productos que por cada oferta especial y la tercera el
detallado de los productos. Lo que queremos obtener es todos los productos de
cada oferta especial:
Sales.SpecialOffer:
Sales.SpecialOfferProduct:
Production.Product
La consulta quedaría así:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
 | SELECT SO.SpecialOfferID, SO.Description, STUFF((       SELECT ','+p.Name       FROM sales.SpecialOfferProduct SOP       INNER JOIN Production.Product P       ON SOP.ProductID = p.ProductID       AND SOP.SpecialOfferID = SO.SpecialOfferID       FOR XML PATH('')),1,1,'' ) as productosFROM Sales.SpecialOffer SO | 
Una forma muy practica y mucho mejor para concatenar valores
en comparación que si utilizaramos un cursor.
Espero que les sirva.
Fuente: http://chancrovsky.blogspot.com/2013/04/concatenar-usando-for-xml-path-y-stuff.html












No hay comentarios:
Publicar un comentario