Cómo hacer una consulta con group_concat en sql server [duplicado]

Resuelto Rahul asked hace 11 años • 4 respuestas

Sé que en el servidor SQL no podemos usar Group_concatla función, pero tengo un problema en el que necesito realizar Group_Concatmi 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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

Etcétera. Así que por favor ayúdenme mientras hago una consulta al respecto.

Rahul avatar Jul 11 '13 17:07 Rahul
Aceptado

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

Devart avatar Jul 11 '2013 10:07 Devart
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
Amit Singh avatar Jul 11 '2013 11:07 Amit Singh

Esto también se puede lograr usando Scalar-Valued FunctionDeclare 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.

AbdulRahman Ansari avatar Jul 18 '2014 09:07 AbdulRahman Ansari

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
roopaliv avatar Jul 17 '2014 10:07 roopaliv