Tuesday, January 24, 2012

Concatenar filas en SQL

A veces quisiéramos mostrar en nuestro reporte por cada maestro, un detalle de datos no en filas sino separados por coma. Por ejemplo, en un x contrato están asociados n servicios. Estos servicios están guardados en una tabla mientras que el contrato en sí, está guardado en otra. Por tanto si el contrato tiene asociados más de un servicio, vamos a tener n filas de servicios y con el join vamos a tener la misma n filas de datos del contrato siendo que n-1 están repetidas.

Me dejo entender, no?

La vaina es concatenar filas. Hay muchas formas de hacerlo. Pero la que he usado y me ha favorecido es "FOR XML PATH"

Por ejemplo, la forma más sencilla, un SELECT directo sin JOIN sería así:

SELECT descripcion + ', ' FROM Servicios_Detalle WHERE cod_servicio=1 FOR XML PATH('')

En la consulta se está agrupando en una sola fila todos los ítem que cumplan el Where dado.

Podrás notar que el resultado se vuelve un link.

Y con un JOIN sería así:

SELECT d.cod_servicio, d.descripcion AS maestro,
(SELECT descripcion + ', '  FROM Servicios_Detalle d2 WHERE d2.cod_servicio=d.cod_servicio FOR XML PATH('')) AS detalles
FROM Servicios d

Esta consulta concatena las filas de detalle que pertenezcan a un maestro dado. La cantidad de filas de resultado será la misma cantidad de filas que hay en la tabla maestro. Ya no se repetirán pues todo estará resumido en una sola fila.

HaPPy CoDiNg! =)

2 comments:

  1. Excelente... justo lo que necesitaba.
    Rápido y conciso

    ReplyDelete
  2. Excelente... justo lo que necesitaba.
    Rápido y conciso

    ReplyDelete