我有以下表格:
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
答案 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