Można to zrobić za pomocą ścieżki XML (dla złączenie wartości grupowych) i grupowanie przez id i anctivity: Konfiguracja
MS SQL Server Schema:
create table tbl (id varchar(2),activity varchar(10),year int);
insert into tbl values
('01' ,'AAAAA', 2008),
('01' ,'AAAAA', 2009),
('01' ,'AAAAA', 2010),
('01' ,'AAAAA', 2012),
('01' ,'AAAAA', 2013),
('01' ,'AAAAA', 2015),
('01' ,'BBBBB', 2014),
('01' ,'BBBBB', 2015)
Query:
select
id, activity,
stuff(
(select distinct ',' + cast(year as varchar(4))
from tbl
where id = t.id and activity=t.activity
for xml path (''))
, 1, 1, '') as years
from tbl AS t
group by id,activity
Results:
| id | activity | years |
|----|----------|-------------------------------|
| 01 | AAAAA | 2008,2009,2010,2012,2013,2015 |
| 01 | BBBBB | 2014,2015 |
Edit po komentarzach i zauważając dobrze do żądanego wyjścia:
jeśli chcesz również grupa Kolejna jak 2008-2009 to trzeba dodatkowe grupowanie (różnica roku i rangi w każdej grupie daje odrębną grupę zagnieżdżoną):
Zapytanie:
with cte1 as
(
select r = year - (rank() over(partition by id,activity
order by year)),
id,activity,year from tbl
)
,cte2 as
(
select
id, activity, cast(min(year) as varchar(4)) +
case when min(year)<>max(year)
then '-' + cast(max(year) as varchar(4))
else '' end as years
from cte1
group by r,id,activity
)
select
id, activity,
stuff(
(select distinct ',' + years
from cte2
where id = t.id and activity=t.activity
for xml path (''))
, 1, 1, '') as years
from cte2 AS t
group by id,activity
Results:
| id | activity | years |
|----|----------|--------------------------|
| 01 | AAAAA | 2008-2010,2012-2013,2015 |
| 01 | BBBBB | 2014-2015 |
niesamowite ......... – Utsav
To jest niesamowite! Dziękuję Ci. – Baussie
Cieszę się, że mogłem pomóc! –