В SQL Server - Как объединить все строки, где RecID одинаков, с CR / LF? - PullRequest
1 голос
/ 22 марта 2019

Мне нужно объединить строки, где Recid одинаковый, но с использованием возврата каретки / перевода строки между значениями строк, а не запятой.

См. Пример данных ниже:

create table #Temp
(
Companyid nvarchar(2),
Recid nvarchar(1), 
Notes nVarchar(max)
)
insert into #Temp 
Values (
'A','1','NotesA1'),
('A','1','NotesA11'),
('A','1','NotesA111'),
('A','2','NotesA2'),
('A','2','NotesA22'),
('B','1','NotesB1')
select Recid, Notes from #Temp where Companyid='A'
drop table #Temp

Как я могу получить следующее:

Recid    Notes
1        NotesA1
         NotesA11
         NotesA111
2        NotesA2
         NotesA22

Я пытался использовать следующее, но он возвращает точки с запятой между значениями:

create table #Temp
(
Companyid nvarchar(2),
Recid nvarchar(1), 
Notes nVarchar(max)
)
insert into #Temp 
Values (
'A','1','NotesA1'),
('A','1','NotesA11'),
('A','1','NotesA111'),
('A','2','NotesA2'),
('A','2','NotesA22'),
('B','1','NotesB1')

SELECT dr.Recid,
STUFF((SELECT '; ' + cast(US.notes  as nvarchar(max))
FROM #Temp US
WHERE US.Recid = DR.Recid and us.COMPANYID='A'
FOR XML PATH('')), 1, 1, '') [Notes]
FROM #Temp DR 
where (dr.Companyid='A') 
GROUP BY DR.Recid
ORDER BY dr.Recid
drop table #Temp

Возвращает:

Recid    Notes
1        NotesA1;NotesA11;NotesA111
2        NotesA2;NotesA22

Приветствую всех за помощь!

1 Ответ

2 голосов
/ 22 марта 2019

Вы были очень близки. Возврат каретки - это символ ASCII 13, а разрыв строки - 10, поэтому он должен быть представлен как CHAR(13) & CHAR(10) (или NCHAR(13) & NCHAR(10) для nvarchar). Из-за способа работы XML некоторые символы могут быть экранированы (в частности, разрыв строки будет показан как '&#x0D'). Поэтому я предпочитаю использовать ключевое слово TYPE, а затем извлекать значения с помощью функции value XML (что я только представил в этом году):

SELECT DR.Recid,
       STUFF((SELECT NCHAR(13) + NCHAR(10) + CAST(US.Notes AS nvarchar(MAX))
              FROM #Temp AS US
              WHERE US.Recid = DR.Recid
                AND US.Companyid = 'A'
             FOR XML PATH(N''),TYPE).value(N'.','nvarchar(MAX)'),1,2,N'') AS [Notes]
FROM #Temp AS DR
WHERE (DR.Companyid = 'A')
GROUP BY DR.Recid
ORDER BY DR.Recid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...