Как сделать запрос с помощью group_concat в sql-сервере
Я знаю, что в sql-сервере мы не можем использовать функцию Group_concat
, но здесь есть одна проблема, в которой мне нужно Group_concat
мой запрос .I google нашел логику, но не смог ее исправить. Мой SQL-запрос это
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 ;
Это дает мне результат, как
Просто посмотрите первые 3 строки. В этом масках, maskname, schoolid, schoolname это же, но maskdetail отличается, поэтому хотите одну строку для той, в которой последний столбец может содержать все maskdetails в соответствии с маскирой и т.д.
Я хочу, чтобы мой вывод выглядел как
И так далее. Поэтому, пожалуйста, помогите мне, делая запрос для этого.
Спасибо заранее.
Ответы
Ответ 1
Query:
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
Дополнительная информация:
Агрегация строк в мире SQL Server
Ответ 2
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
Ответ 3
Это также может быть достигнуто с помощью Scalar-Valued Function
in 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 [email protected]
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 ;
Примечание. Возможно, вам придется изменить функцию, так как я не знаю полной структуры таблицы.
Ответ 4
Пожалуйста, запустите указанный ниже запрос, это не требует STUFF и GROUP BY в вашем случае:
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