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:
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