2015-08-15 2 views
0

У меня есть следующие таблицы.Конкатенация нескольких строк и столбцов в SQL Server

Student стол:

Id   Name 
1   A 
2   B 

Marks стол:

StudentId SubjectId Marks 
1   1  67 
1   2  89 
2   1  78 
2   2  86 

Хочу Concat несколько строк для заданного studentId и SubjectId, колонны Marks в одну колонку, как показано ниже.

Результат:

Id   Name SubjectMarks 
1   A  1:67,2:89 
2   B  1:78,2:86 

Я попытался FOR XML PATH. Он работает для одного столбца, но для 2 столбцов я не мог написать запрос.

ответ

2

Вы можете сделать это без CTE:

select s.id, s.name, 
     stuff((select ',' + cast(subjectid as varchar(8000)) + ':' + cast(marks as varchar(8000)) 
      from marks m 
      where m.studentid = s.id 
      for xml path (''), type 
      ).value('.', 'varchar(max)'), 1, 1, '' 
      ) as SubjectMarks 
from student s; 
1

SQL Fiddle

сервера Настройка MS SQL 2008 схемы:

CREATE TABLE Student (Id INT, Name VARCHAR(10)) 
INSERT INTO Student VALUES 
(1 ,'A'), 
(2 ,'B') 

CREATE TABLE Marks (StudentId INT , SubjectId INT , Marks INT) 
INSERT INTO Marks VALUES 
(1  ,  1 , 67), 
(1  ,  2 , 89), 
(2  ,  1 , 78), 
(2  ,  2 , 86) 

Запрос 1:

;WITH cte AS 
(
    SELECT StudentId 
     , CAST(SubjectId AS VARCHAR(10)) + ':' 
      + CAST(Marks AS VARCHAR(10)) AS SubjectMarks 
    FROM Marks 
) 
SELECT DISTINCT 
     S.Id 
     ,S.Name 
     ,STUFF((SELECT ',' + SubjectMarks 
       FROM cte 
       WHERE x.StudentId = StudentId 
       FOR XML PATH(''),TYPE) 
       .value('.','Varchar(max)'),1,1,'') AS SubjectMarks 
FROM cte x 
INNER JOIN Student S ON S.Id = x.StudentId 

Results:

| Id | Name | SubjectMarks | 
|----|------|--------------| 
| 1 | A | 1:67,2:89 | 
| 2 | B | 1:78,2:86 |