Как сделать запрос с группой concat в sql server [дубликат]
этот вопрос уже есть ответ здесь:
Я знаю, что в sql server мы не можем использовать
4 ответа:
запрос:
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
дополнительная информация:
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
Это также может быть достигнуто с помощью
Scalar-Valued Function
наMSSQL 2008
Объявите свою функцию следующим образом,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
и тогда ваш окончательный запрос будет как
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 ;
Примечание: возможно, вам придется изменить функцию, так как я не знаю полной структуры таблицы.
пожалуйста, запустите следующий запрос, он не требует материала и группы в вашем случае:
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