-- Table to hold test data
declare @T table
(
ClientID int,
ItemID int
)
insert into @T values
(1, 1),(1, 2),(1, 3),
(2, 1),(2, 2),
(3, 3),(4, 3),
(5, 1),(5, 2),(5, 4),(5, 5)
-- Temp table that will hold the generated set's
declare @Tmp table
(
ClientID int,
ItemIDSet varchar(max),
SetID int
)
-- Query the sets using rank() over a comma separated ItemIDSet
insert into @Tmp
select ClientID,
ItemIDSet,
rank() over(order by ItemIDSet) as SetID
from (
select T1.ClientID,
stuff((select ','+cast(T2.ItemID as varchar(10))
from @T as T2
where T1.ClientID = T2.ClientID
order by T2.ItemID
for xml path('')), 1, 1, '') as ItemIDSet
from @T as T1
group by T1.ClientID
) as T
-- Get ClientID and SetID from @Tmp
select ClientID,
SetID
from @Tmp
order by ClientID
-- Get SetID and ItemID from @Tmp
select SetID,
T3.N.value('.', 'int') as ItemID
from (
select distinct
SetID,
'<i>'+replace(ItemIDSet, ',', '</i><i>')+'</i>' as ItemIDSet
from @Tmp
) as T1
cross apply
(
select cast(T1.ItemIDSet as xml) as ItemIDSet
) as T2
cross apply T2.ItemIDSet.nodes('i') as T3(N)
Результат:
ClientID SetID
----------- -----------
1 2
2 1
3 4
4 4
5 3
SetID ItemID
----------- -----------
1 1
1 2
2 1
2 2
2 3
3 1
3 2
3 4
3 5
4 3
Значения SetID не совсем такие же, как в предоставленных вами результатах, но я не думаю, что это будет большой проблемой. SetID генерируются из функции ранга rank() over(order by ItemIDSet)
, упорядоченной ItemIDSet.
Возьми его за спин .