July 24, 2019

Агрегация строк в SQL Server

Пару способов я знаю, через FOR XML PATH и STRING_AGG (only in SQL SERVER 2017), но тем не менее кое что новое открыл:

https://habr.com/ru/post/52504/

Создаем таблицу

CREATE TABLE Items(GroupId INT, Item NVARCHAR(10)) INSERT INTO Items(GroupId, Item) SELECT 1 AS GroupId, 'AAA' AS Item UNION ALL SELECT 2, 'IS' UNION ALL SELECT 5, 'OMG' UNION ALL SELECT 2, 'WHAT' UNION ALL SELECT 2, 'THE' UNION ALL SELECT 1, 'This'

вот такого вида

Получить надо примерно такое:

Понравился трюк за номером 2:

Есть более красивый способ, не использующий временных таблиц. Он основан на трюке
SELECT var= var + ',' + col FROM smwhere
 Да, так можно и это работает:

CREATE FUNCTION ConcatItems(@GroupId INT) RETURNS NVARCHAR(100)

AS

BEGIN

DECLARE @ItemList varchar(8000)

SET @ItemList = ''

SELECT @ItemList = @ItemList + ',' + Item

FROM Items WHERE GroupId = @GroupId

RETURN

SUBSTRING(@ItemList, 2, 100)

END

GO

SELECT GroupId, dbo.ConcatItems(GroupId) ItemList

FROM Items

GROUP BY GroupId