Como fazer uma consulta com o grupo concat no servidor sql [duplicate]
Eu sei que no servidor sql não podemos usar a função Group_concat
mas aqui está um problema que eu tenho no qual eu preciso Group_Concat
minha consulta.Eu google encontrou alguma lógica, mas não capaz de corrigir it.My pesquisa sql riz[6]}
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 ;
Dá-me um resultado como
Basta olhar as 3 primeiras linhas Em que maskid,maskname,schoolid,schoolname é o mesmo, mas maskdetail é diferente, então quer uma linha para que, em última coluna pode conter todos os maskdetails como por maskid e assim por diante.
quero a minha produção como
e assim on.So por favor, ajude-me a fazer uma pergunta para isso.
Obrigado antecipadamente.4 answers
Pesquisa:
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
Informações Adicionais:
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
Isto também pode ser conseguido usando o Scalar-Valued Function
em MSSQL 2008
Declare a sua função como se segue,
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
E então a tua pergunta 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: {[12] } Você pode ter que mudar a função, pois eu não conheço a estrutura completa da tabela.
Por favor, execute a consulta abaixo, ela não precisa de coisas e grupo por no seu 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