2016-10-05 6 views
0

Как я могу выполнить конкатенацию идентификаторов курса, разделенных запятыми, для каждого ученика?Как сделать CONCAT на GROUP BY на SQL Server?

select student.ID, 
    concat(student_course.COURSE_ID,',') 
    from student.ID join student_course on student.ID=student_course.STUDENT_ID 
group by student.ID 

Student Id | Course Id 
1   | 101, 230, 432 
2   | 293, 101 
+0

я думаю, что его не дублируется –

ответ

1

Используйте приведенный ниже скрипт с помощью "STUFF"

SELECT ID [Student ID] 
     ,STUFF((SELECT ', ' + CAST(COURSE_ID AS VARCHAR(10)) [text()] 
     FROM student_course 
     WHERE STUDENT_ID =s.ID 
     FOR XML PATH(''), TYPE) 
     .value('.','NVARCHAR(MAX)'),1,2,' ') [Course Id] 
FROM student s 
GROUP BY ID 

Здесь приходит другой метод, использующий 'Cross Apply.

SELECT Id as [Student ID],[Course ID] 
FROM (
     SELECT [Id] 
     FROM student 
     ) a 
CROSS APPLY 
     (
     SELECT CASE ROW_NUMBER() OVER(ORDER BY COURSE_ID) WHEN 1 THEN '' ELSE ', ' END +CAST(COURSE_ID as varchar(50)) 
     FROM student_course b 
     WHERE a.id = b.STUDENT_ID 
     ORDER BY COURSE_ID 
     FOR XML PATH ('') 
     ) b([Course ID]) 
+0

Если вы не ожидаете, запрещенные символы это можно сделать немного проще без '.values'-call (untested):' SELECT ID [Идентификатор студента] , STUFF ((SELECT ',' + CAST (c.COURSE_ ID AS VARCHAR (10)) ИЗ student_course КАК с ГДЕ c.STUDENT_ID = s.ID FOR XML PATH ('')), 1,2, '') [Id курс] ОТ Студентски GROUP BY ID ' – Shnugo

+0

@ Шунго - соглашайтесь с вами .. –