web-dev-qa-db-fra.com

Comment faire une requête avec group_concat dans un serveur SQL

Je sais que dans le serveur SQL, nous ne pouvons pas utiliser la fonction Group_concat, mais voici un problème dans lequel j’ai besoin de Group_Concat ma requête. la requête est

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 ;

Ça me donne des résultats comme

enter image description here

Il suffit de regarder les 3 premières lignes. Dans cet identifiant, masqueur, masqueur, identifiant, est identique, mais masquedetail est différent. Vous voulez donc une rangée dans laquelle la dernière colonne peut contenir tous les détails du masquage, comme par masquid, etc.

Je veux ma sortie comme

enter image description here

Et ainsi de suite. Alors aidez-moi s'il vous plait.

Merci d'avance.

100
Rahul

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

134
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
28
Amit Singh

Ceci peut également être réalisé en utilisant le Scalar-Valued Function dans 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 puis votre dernière requête 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 changer la fonction, car je ne connais pas la structure complète du tableau.

7
AbdulRahman Ansari

S'il vous plaît lancer la requête ci-dessous, il 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
5
roopaliv