Cómo hacer una consulta con group_concat en sql server [duplicado]
Sé que en el servidor SQL no podemos usar Group_concat
la función, pero tengo un problema en el que necesito realizar Group_Concat
mi consulta. Busqué en Google y encontré algo de lógica pero no pude 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 resultado como
Simplemente mire las primeras 3 filas en ese ID de máscara, nombre de máscara, ID de escuela, nombre de escuela es el mismo pero el detalle de máscara es diferente, por lo que desea una fila para aquella en la que la última columna pueda contener todos los detalles de la máscara según MaskID, etc.
Quiero mi salida como
Etcétera. Así que por favor ayúdenme mientras hago una consulta al respecto.
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 cadenas 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
Esto también se puede lograr usando Scalar-Valued Function
Declare MSSQL 2008
su función de la siguiente manera,
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 luego 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: Es posible que tengas que cambiar la función, ya que no conozco la estructura completa de la tabla.
Ejecute la siguiente consulta, no requiere STUFF ni 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