stuff string_agg group_concat sql-server sql-server-group-concat

sql-server - string_agg - stuff select sql server



Cómo hacer una consulta con group_concat en el servidor sql (4)

Esta pregunta ya tiene una respuesta aquí:

Sé que en el servidor sql no podemos usar la función Group_concat pero aquí hay un problema que tengo para que Group_Concat mi query.I google encontró algo de lógica pero no pudo corregirla. Mi consulta sql es

select m.maskid,m.maskname,m.schoolid,s.schoolname, md.maskdetail from tblmask m join school s on s.id = m.schoolid join maskdetails md on m.maskid = md.maskid order by m.maskname ;

Me da resultados como

Solo mira las primeras 3 filas En ese maskid, maskname, schoolid, schoolname es el mismo pero maskdetail es diferente, así que quiero una fila para la que la última columna puede contener todos los maskdetails como maskid y así sucesivamente.

Quiero mi salida como

Y así sucesivamente. Por favor ayúdenme al hacer una consulta para eso.

Gracias por adelantado.


Ejecute la siguiente consulta, no requiere STUFF y GROUP BY en su caso:

Select A.maskid , A.maskname , A.schoolid , B.schoolname , CAST(( SELECT T.maskdetail+'','' FROM dbo.maskdetails T WHERE A.maskid = T.maskid FOR XML PATH(''''))as varchar(max)) as maskdetail FROM dbo.tblmask A JOIN dbo.school B ON B.ID = A.schoolid


Esto también se puede lograr utilizando la función de valor Scalar-Valued Function en MSSQL 2008
Declara tu función como siguiente,

CREATE FUNCTION [dbo].[FunctionName] (@MaskId INT) RETURNS Varchar(500) AS BEGIN DECLARE @SchoolName varchar(500) SELECT @SchoolName =ISNULL(@SchoolName ,'''')+ MD.maskdetail +'', '' FROM maskdetails MD WITH (NOLOCK) AND MD.MaskId=@MaskId RETURN @SchoolName END

Y entonces tu consulta final será como

SELECT m.maskid,m.maskname,m.schoolid,s.schoolname, (SELECT [dbo].[FunctionName](m.maskid)) ''maskdetail'' FROM tblmask m JOIN school s on s.id = m.schoolid ORDER BY m.maskname ;

Nota: Puede que tenga que cambiar la función, ya que no conozco la estructura completa de la tabla.


Consulta:

SELECT m.maskid , m.maskname , m.schoolid , s.schoolname , maskdetail = STUFF(( SELECT '','' + md.maskdetail FROM dbo.maskdetails md WHERE m.maskid = md.maskid FOR XML PATH(''''), TYPE).value(''.'', ''NVARCHAR(MAX)''), 1, 1, '''') FROM dbo.tblmask m JOIN dbo.school s ON s.ID = m.schoolid ORDER BY m.maskname

Información Adicional:

Agregación de cadena en el mundo de SQL Server


Select A.maskid , A.maskname , A.schoolid , B.schoolname , STUFF(( SELECT '','' + T.maskdetail FROM dbo.maskdetails T WHERE A.maskid = T.maskid FOR XML PATH('''')), 1, 1, '''') as maskdetail FROM dbo.tblmask A JOIN dbo.school B ON B.ID = A.schoolid Group by A.maskid , A.maskname , A.schoolid , B.schoolname