136 votes

Comment faire une requête avec group_concat dans sql server

Je sais que dans sql server on ne peut pas utiliser Group_concat mais il y a un problème que j'ai dans lequel j'ai besoin de Group_Concat J'ai cherché sur Google et j'ai trouvé une certaine logique mais je n'ai pas réussi à la corriger.

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 ;

Cela me donne un résultat comme

enter image description here

Il suffit de regarder les 3 premières lignes dans lesquelles maskid, maskname, schoolid, schoolname sont les mêmes mais maskdetail est différent. Je veux donc une ligne pour cela dans laquelle la dernière colonne peut contenir tous les maskdetails comme par maskid et ainsi de suite.

Je veux que mon résultat soit le suivant

enter image description here

Et ainsi de suite. Alors s'il vous plaît aidez-moi à faire une demande pour cela.

Merci d'avance.

189voto

Devart Points 52715

Une requête :

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

Informations complémentaires :

Agrégation de chaînes dans le monde de SQL Server

34voto

Amit Singh Points 5835
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

9voto

Cela peut également être réalisé en utilisant l'option Scalar-Valued Function sur MSSQL 2008
Déclarez votre fonction comme suit,

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

Et alors votre requête finale sera comme

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 ;

Note : Vous devrez peut-être modifier la fonction, car je ne connais pas la structure complète de la table.

7voto

Paali Points 181

Veuillez exécuter la requête ci-dessous, elle ne nécessite pas STUFF et GROUP BY dans votre cas :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X