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
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
Et ainsi de suite. Alors aidez-moi s'il vous plait.
Merci d'avance.
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:
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
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.
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