Функция STUFF для отображения нескольких столбцов с запятыми в SQL Server - PullRequest
0 голосов
/ 01 ноября 2019

Мне нужно отобразить значения столбца таблицы (предположим, 2 столбца) с разделителями-запятыми в выводе

col1    Col2    
================
xyz       abc  
pqr       uvw   

Требуется вывод:

Col1      Col2
========  =======
xyz,pqr    abc,uvw

Я пробовал запрос ниже, но неубедитесь, как включить col2 в приведенный ниже запрос и сделать его одним запросом:

SELECT 
    STUFF((SELECT DISTINCT ',' + CAST(t.Col1 AS VARCHAR(MAX))
           FROM Table_1 t
           FOR XML PATH('')), 1, 1, '')

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

SQL Fiddle

Настройка схемы MS SQL Server 2017 :

create table MyTable(ColA varchar(max),ColB varchar(max))
INSERT INTO MyTable(ColA,ColB)VALUES('xyz','abc')
INSERT INTO MyTable(ColA,ColB)VALUES('pqr','uvw')

Запрос 1 :

SELECT STUFF((select  ',' + cast(t.ColA as varchar(max))
from MyTable t
for xml path ('')
), 1, 1, '') AS ColA,
STUFF((select  ',' + cast(t.ColB as varchar(max))
from MyTable t
for xml path ('')
), 1, 1, '') AS ColB

Запрос 2 :

 SELECT 
       STRING_AGG(colA, ',') AS colA,
       STRING_AGG(colB, ',') AS colB
    FROM MyTable

Результаты :

|    ColA |    ColB |
|---------|---------|
| xyz,pqr | abc,uvw |
1 голос
/ 01 ноября 2019

Это один из возможных подходов:

Таблица:

CREATE TABLE Data (
   col1 nvarchar(50),
   col2 nvarchar(50)
)
INSERT INTO Data 
   (col1, col2)
VALUES
   (N'xyz', N'abc'),
   (N'pqr', N'uvw')

Статус:

SELECT 
   Col1 = STUFF((SELECT CONCAT(',', col1) FROM Data FOR XML PATH(''),TYPE).value(N'.','nvarchar(max)'), 1, 1, ''),
   Col2 = STUFF((SELECT CONCAT(',', col2) FROM Data FOR XML PATH(''),TYPE).value(N'.','nvarchar(max)'), 1, 1, '')   

Результат:

Col1    Col2
xyz,pqr abc,uvw

Примечания:Если вы используете SQL Server 2017+, вы можете использовать STRING_AGG():

SELECT 
   STRING_AGG(col1, N',') AS col1,
   STRING_AGG(col2, N',') AS col2
FROM Data
...