Запрос SQL для получения агрегированного результата в разделителях запятых вместе с группой по столбцу в SQL Server
Мне нужно написать SQL-запрос к таблице так, чтобы в результате был групп по столбцу вместе с агрегированным столбцом с разделителями запятыми.
Моя таблица будет в следующем формате
|`````````|````````|
| ID | Value |
|_________|________|
| 1 | a |
|_________|________|
| 1 | b |
|_________|________|
| 2 | c |
|_________|________|
Ожидаемый результат должен быть в следующем формате
|`````````|````````|
| ID | Value |
|_________|________|
| 1 | a,b |
|_________|________|
| 2 | c |
|_________|________|
3 ответа
Вы хотите использовать FOR XML PATH
построить:
select
ID,
stuff((select ', ' + Value
from YourTable t2 where t1.ID = t2.ID
for xml path('')),
1,2,'') [Values]
from YourTable t1
group by ID
STUFF
функция состоит в том, чтобы избавиться от ведущих ', '
,
Вы также можете увидеть другие примеры здесь:
В SQL Server 2017 (14.x) и более поздних версиях вы можете использовать функцию STRING_AGG:
https://learn.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-ver16
SELECT
ID,
STRING_AGG(Value, ',')
FROM TableName
GROUP BY ID
В зависимости от типа данных значения вам может потребоваться преобразовать его:
SELECT
ID,
STRING_AGG(CONVERT(NVARCHAR(max), Value), ',')
FROM TableName
GROUP BY ID
Просто для сбалансированного представления вы можете сделать это с помощью CTE, но это не так хорошо, как метод перекрестного применения, я не думаю. Я закодировал это копыто, поэтому извиняюсь, если оно не работает.
WITH CommaDelimitedCTE (RowNumber,ID,[Value],[Values]) AS
(
SELECT 1,MT.ID , MIN(MT.Value), CAST(MIN(MT.Value) AS VARCHAR(8000))
FROM MyTable MT
GROUP BY MT.ID
UNION ALL
SELECT CT.RowNumber + 1, MT.ID, MT.Value, CT.[Values] + ', ' + MT.Value
FROM MyTable MT
INNER JOIN CommaDelimitedCTE CT ON CT.ID = MT.ID
WHERE MT.[Value] > CT.[Value]
)
Select CommaDelimitedCTE.* from CommaDelimitedCTE
INNER JOIN (SELECT MT.ID,MAX(RowNumber) as MaxRowNumber from CommaDelimitedCTE GROUP BY MT.ID) Q on Q.MT.ID = CommaDelimitedCTE.MT.ID
AND Q.MaxRowNumber = CommaDelimitedCTE.RowNumber