我可以在sql server中创建吗?

时间:2017-05-18 11:11:03

标签: sql-server concatenation

我有以下表格:

Locaiton Val1   Val2
L1       1      2
L1       0      5
L1       4      1
L1       7      8
L2       1      3
L2       6      1
L2       2      11
L2       0      2
L2       6      3
L2       8      4
L2       1      1

我想将其转换如下:     位置Val1 Val2

Location    Val1            Val2
L1          1,0,4,7,1,6     2,5,1,8,3,1
L2          2,0,6,7,1       11,2,3,4,1

3 个答案:

答案 0 :(得分:0)

这是一种痛苦。你需要做两次字符串连接技巧:

select t.location,
       stuff( (select ',' + cast(val1 as varchar(255))
               from t t2
               where t2.location = t.location
               for xml path ('')
              ), 1, 1, ''
            ) as val1s,
       stuff( (select ',' + cast(val2 as varchar(255))
               from t t2
               where t2.location = t.location
               for xml path ('')
              ), 1, 1, ''
            ) as val2s
from (select distinct location from t) t;

请注意,每个列表中的ID顺序是不确定的。这就是SQL的工作原理。如果您希望按特定顺序使用它们,则需要向子查询添加ORDER BY。您的样本数据没有明显的排序列。

答案 1 :(得分:0)

您可以使用以下内容

select [Location], stuff ((
select ',' + val1 from #Table1 where [Location] = t.[Location] 
for xml path('')
),1,1,'') as Val1,
stuff ((
select ',' + val2 from #Table1 where [Location] = t.[Location] 
for xml path('')
),1,1,'') as Val2
from #Table1 t
group by [Location]

如果是sql server 2017或vnext,你可以使用string_agg

select [Location], val1 = string_agg(val1,','), val2 = string_agg(val2,',')
    from #table1 
group by [Location]

答案 2 :(得分:0)

您可以通过以下查询

    SELECT  Location
        ,STUFF((SELECT DISTINCT ','+CAST(Val1 AS NVARCHAR)
                FROM YourTable t
                WHERE t.Location = Location),1,1,'')    AS Val1
        ,STUFF((    SELECT DISTINCT ','+CAST(Val2 AS NVARCHAR)
            FROM YourTable t
            WHERE t.Location = Location),1,1,'')    AS Val2
FROM YourTable
GROUP BY Location