它不漂亮,但我认为这可行:
-- Set up temp table and test data
create table #values
(
uniqueID varchar(100),
value int
)
insert into #values
select 'name1', 110
union
select 'name1', 111
union
select 'name1', 112
union
select 'name1', 113
union
select 'name1', 120
union
select 'name1', 121
union
select 'name1', 130
union
select 'name1', 131
union
select 'name2', 110
union
select 'name2', 111
union
select 'name2', 112
union
select 'name2', 113
union
select 'name2', 114
union
select 'name2', 120
union
select 'name2', 130
union
select 'name2', 131
union
select 'name2', 132
go
-- Create CTE to add '@' to the last value in each series
with results (uniqueId, [value])
as
(
select distinct
v1.uniqueID
,case when v2.[value] is null then convert(varchar,v1.[value]) + '@' else convert(varchar,v1.[value]) end as [value]
from #values v1
left join #values v2 on v1.uniqueID = v2.uniqueID and v2.[value] > v1.[value] and v1.[value] / 10 = v2.[value] / 10
)
-- Return STUFFed final string (using reverse to remove trailing '@' without repeating code)
select
uniqueId
,reverse(stuff(reverse(replace(stuff((select distinct ',' + [value] from results r2 where r1.uniqueId = r2.uniqueId for xml path ('')),1,1,''),'@,','@')),1,1,'')) as [value]
from results r1
drop table #values
结果:
/-----------------------------------------------\
|uniqueId | value |
|---------|-------------------------------------|
| name1 | 110,111,112,113@120,121@130,131 |
| name1 | 110,111,112,113@120,121@130,131 |
| name1 | 110,111,112,113@120,121@130,131 |
| name1 | 110,111,112,113@120,121@130,131 |
| name1 | 110,111,112,113@120,121@130,131 |
| name1 | 110,111,112,113@120,121@130,131 |
| name1 | 110,111,112,113@120,121@130,131 |
| name1 | 110,111,112,113@120,121@130,131 |
| name2 | 110,111,112,113,114@120@130,131,132 |
| name2 | 110,111,112,113,114@120@130,131,132 |
| name2 | 110,111,112,113,114@120@130,131,132 |
| name2 | 110,111,112,113,114@120@130,131,132 |
| name2 | 110,111,112,113,114@120@130,131,132 |
| name2 | 110,111,112,113,114@120@130,131,132 |
| name2 | 110,111,112,113,114@120@130,131,132 |
| name2 | 110,111,112,113,114@120@130,131,132 |
| name2 | 110,111,112,113,114@120@130,131,132 |
\-----------------------------------------------/