Esta tarde, para hacer un informe en una aplicación en el trabajo (SQL-Server+ASP+VB), necesitaba sacar todos los registros de una columna en un solo registro separado por un símbolo. Podéis decir que podría haber hecho una consulta normal y luego simplemente añadir las comas al imprimirla en pantalla, pero en este caso necesitaba que vinieran así en la consulta SQL.
Si bien en un principio pensé en utilizar un cursor, al final rebuscando por el manual de SQL-Server 2008 (que debe ser de los pocos que tengo en papel y no en PDF) encontré una solución que consume menos recursos.
Empecemos con la tabla, más o menos esta
CREATE TABLE Problemas( Id INT PRIMARY KEY IDENTITY(1,1), Incidencia VARCHAR(120), Usuario INT, Fecha DATETIME )
Bien, la cosa es tener una cadena con todas las incidencias separadas por una «tubería» (el caracter | ).
El procedimiento va a ser el siguiente: declaramos una variable, hacemos un select donde vayamos concatenando cada resultado dentro de la variable, hacemos un apañico porque nos va a meter un separador al principio y acabamos con un select sobre la variable para mostrarla/recogerla.
--Declaramos la variable DECLARE @ListaIncidencias VARCHAR(MAX) = '' --Ahora vamos con la consulta SELECT @ListaIncidencias = @ListaIncidencias +'|' + p.Incidencia FROM Problemas p --Eliminamos el separador extra que nos meterá al principio --usando SUBSTRING SET @ListaIncidencias = SUBSTRING(@ListaIncidencias,2,LEN(@ListaIncidencias)) --Hacemos un SELECT sobre la variable para sacarla por pantalla SELECT @ListaIncidencias as 'Incidencias'
De esta forma todos los registros aparecerán como una cadena de texto dentro de una sola celda.
Excelente post.
wow, estaba pasando por lo mismo, solo veia la luz haciendo un cursor. este codigo es tipo nasa 😀
gracias!
Excelente justo lo que estaba necesitando