Объедините SQL результатов в столбец, разделенный запятыми - PullRequest
0 голосов
/ 21 апреля 2020

для данного примера запроса

select student.name, student.code, student.age, studentClass.classId
from student
inner join studentClass
on student.studentId == studentClass.studentId

возвращает результаты, подобные этому

student.Name    student.code   student.age   studentClass.classId
---             ----           ---           ---
Jeremy          381            20            14
Jeremy          381            20            5
Jeremy          381            20            11
Sarah           920            23            20
Sarah           920            23            3

как я могу изменить запрос, чтобы объединить все строки по student.name и разделить запятую classId?

student.Name    student.code   student.age   studentClass.classId
---             ----           ---           ---
Jeremy          381            20            14,5,11
Sarah           920            23            20,3

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Если вы используете SQL Server 2017 или выше, вы можете присоединиться и использовать string_agg():

select
    s.name, 
    s.code,
    s.age,
    string_agg(sc.classId, ',') classIds
from student s
inner join studentClass sc on sc.studentId = s.studentId
group by s.name, s.code, s.age
0 голосов
/ 21 апреля 2020

Вы можете использовать следующий запрос, используя FOR XML PATH('').

create table Student(StudentId int identity(1, 1)
 , Name varchar(20)
 , code int
 , age  int
 , classId int)

 insert into Student values
('Jeremy', 381, 20, 14),
('Jeremy', 381, 20, 5),
('Jeremy', 381, 20, 11),
('Sarah',  920, 23, 20),
('Sarah',  920, 23, 3)

 create table StudentClass (classId int
 , className varchar(20))

insert into StudentClass values
(3,  'Class A'),
(5,  'Class B'),
(10, 'Class C'),
(11, 'Class D'),
(14, 'Class E'),
(14, 'Class F')

SELECT Name, Code, Age, classId = 
    STUFF((SELECT ', ' + Cast(classId as varchar(3))
           FROM Student b 
           WHERE b.Name = a.Name
             and b.Code = a.Code
             and b.age = a.age
          FOR XML PATH('')), 1, 2, '')
FROM Student a
GROUP BY  Name
   , Code
   , Age

Live db <> fiddle demo.

...