Преобразовать один столбец в одну строку в T-SQL - PullRequest
1 голос
/ 29 октября 2019

У меня есть оператор выбора, который выдает один большой столбец. То, что я хотел бы сделать, это преобразовать один столбец в одну строку, чтобы я мог передать его в другую хранимую процедуру. Как я могу транспонировать таблицу, чтобы она была одной строкой? До сих пор я пробовал UNIPIVOT, но не смог заставить его работать.

Вот формат текущей таблицы (в действительности она намного длиннее с переменным количеством строк):

+------+
| Col1 |
+------+
|    1 |
|   56 |
|   83 |
|  345 |
| 4322 |
| 4456 |
+------+

, которая хранится в локальной таблице #localtable

Я хотел бы превратить приведенную выше таблицу в приведенную ниже таблицу:

+------+------+------+------+------+------+
| Col1 | Col2 | Col3 | Col4 | col5 | col6 |
+------+------+------+------+------+------+
|    1 |   56 |   83 |  345 | 4322 | 4456 |
+------+------+------+------+------+------+

в качестве промежуточного этапа преобразования ее в следующую строку с разделителями-запятыми:

'1, 56, 83, 345, 4322, 4456'

С целью подачи его в exec, как:

exec myfunction '1, 56, 83, 345, 4322, 4456'

Ответы [ 3 ]

2 голосов
/ 29 октября 2019

Вы можете использовать string_agg() в самых последних версиях SQL Server:

select string_agg(col, ', ')
from #localtable;
2 голосов
/ 05 ноября 2019

Вот еще одно решение, которое будет работать со старой версией SQL Server (где нет string_agg):

--create test table
declare @tmp table (Col1 int)

--populate test table
insert into @tmp
values
 (    1)
,(   56)
,(   83)
,(  345)
,( 4322)
,( 4456)

--declare a variable that will contain the final result
declare @result varchar(4000) = ''

--populate final result from table
select @result = @result + ', ' + cast(Col1 as varchar) from @tmp

--remove first unnecessary comma
set @result = STUFF(@result, 1, 1, '') 

--print result
select @result as result

Результат:

enter image description here

2 голосов
/ 29 октября 2019

Я смог решить эту проблему с помощью следующего запроса, создав желаемую строку с разделителями-запятыми:

SELECT STUFF((SELECT  ',' + CAST(Col1 AS VARCHAR(50))
            FROM #localtable
        FOR XML PATH('')), 1, 1, '') AS listStr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...