Объединение значений столбцов в список через запятую - PullRequest
55 голосов
/ 26 июня 2009

Что такое синтаксис TSQL для форматирования выходных данных, чтобы значения столбцов отображались в виде строки, разделенной запятыми.

Например, моя таблица CARS имеет следующее:

CarID    CarName  
----------------
    1    Porsche  
    2    Mercedes  
    3    Ferrari  

Как я могу получить названия автомобилей как: Porsche, Mercedes, Ferrari

Ответы [ 8 ]

61 голосов
/ 26 июня 2009
SELECT LEFT(Car, LEN(Car) - 1)
FROM (
    SELECT Car + ', '
    FROM Cars
    FOR XML PATH ('')
  ) c (Car)
45 голосов
/ 26 июня 2009

Вы можете сделать ярлык, используя coalesce, чтобы объединить ряд строк из записи в таблице, например.

declare @aa varchar (200)
set @aa = ''

select @aa = 
    case when @aa = ''
    then CarName
    else @aa + coalesce(',' + CarName, '')
    end
  from Cars

print @aa
23 голосов
/ 18 ноября 2014

Вы можете сделать это, используя вещи:

SELECT Stuff(
    (
    SELECT ', ' + CARS.CarName
    FROM CARS
    FOR XML PATH('')
    ), 1, 2, '') AS CarNames
11 голосов
/ 25 января 2017

Если вы работаете в SQL Server 2017 или базе данных SQL Azure, вы делаете что-то вроде этого:

 SELECT STRING_AGG(CarName,',') as CarNames
 FROM CARS 
9 голосов
/ 01 августа 2014

Другое решение в запросе:

select 
    Id, 
    STUFF(
        (select (', "' + od.ProductName + '"')
        from OrderDetails od (nolock)
        where od.Order_Id = o.Id
        order by od.ProductName
        FOR XML PATH('')), 1, 2, ''
    ) ProductNames
from Orders o (nolock)
where o.Customer_Id = 525188
order by o.Id desc

(РЕДАКТИРОВАТЬ: спасибо @ user007 за объявление STUFF)

8 голосов
/ 26 июня 2009
DECLARE @CarList nvarchar(max);
SET @CarList = N'';
SELECT @CarList+=CarName+N','
FROM dbo.CARS;
SELECT LEFT(@CarList,LEN(@CarList)-1);

Спасибо всем, кто в SO показал мне использование накопления данных во время запроса.

2 голосов
/ 13 сентября 2017

Пожалуйста, попробуйте это с помощью следующего кода:

DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+',' , '') + CarName
FROM Cars
SELECT @listStr
2 голосов
/ 25 апреля 2016
 DECLARE @SQL AS VARCHAR(8000)
SELECT @SQL = ISNULL(@SQL+',','') + ColumnName FROM TableName
SELECT @SQL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...