Как объединить текст в несколько строк в T_SQL - PullRequest
0 голосов
/ 27 мая 2020

Я работаю над проблемой ниже на SQL сервере, используя T- SQL, и натолкнулся на небольшой барьер.

Я хочу объединить несколько строк текста в одну строку (текстовый столбец ниже) на основе personID.

Например, если мои необработанные данные:

PersonID   Text                     Line Number
-----------------------------------------------
A          The woman went to        1
A          the zoo,                 2
A          then went home.          3
B          A man went to            1
B          the aquarium,            2
B          spoke to                 3 
B          the fish,                4
B          then got an ice cream.   5
C          People love              1
C          football.                2

, мне нужно, чтобы результат был:

PersonID   Text                                                                        
Line Number
-------------------------------------------------------------------------------
A          The woman went to    the zoo,  then went home.                              1
B          A man went to the aquarium, spoke to the fish,   then got an ice cream.     1
C          People love  football.                                                      1

Количество текстовых строк с необработанными данными варьируется от человека к человеку, и я не могу найти решение, чтобы учесть это (например, человек A = 3, человек B = 5, человек C = 2).

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Если у вас SQL Server 2017 или более поздней версии, вы можете использовать STRING_AGG () следующим образом:

CREATE TABLE #Person (PersonID varchar(2), PersonText varchar(100), Line_Number int)

INSERT INTO #Person VALUES('A','The woman went to',1)
INSERT INTO #Person VALUES('A','the zoo,',2)
INSERT INTO #Person VALUES('A','then went home.',3)
INSERT INTO #Person VALUES('B','A man went to',1)
INSERT INTO #Person VALUES('B','the aquarium,', 2)
INSERT INTO #Person VALUES('B','spoke to',3 )
INSERT INTO #Person VALUES('B','the fish,',4)
INSERT INTO #Person VALUES('B','then got an ice cream.',5)
INSERT INTO #Person VALUES('C','People love',1)
INSERT INTO #Person VALUES('C','football.',2)

select PersonID, STRING_AGG(PersonText, ' ') PersonText
from #Person
GROUP BY PersonID

Если нет, то использование FOR XML также сделает это:

SELECT PersonID, 
    (SELECT PersonText + ' ' 
            FROM #Person t1 
            WHERE t1.PersonID = t2.PersonID ORDER BY Line_Number FOR XML PATH('') ) PersonText
FROM  #Person t2
GROUP BY PersonID
1 голос
/ 27 мая 2020
SELECT DISTINCT
    t.PersonID,
    (
    SELECT
        tt.[Text] + ' '
    FROM
        my_table tt
    WHERE
        t.PersonID = tt.PersonID
    ORDER BY
        tt.[Line Number]
    FOR XML PATH('')
    ) AS text_out
FROM
    my_table t
...