Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Периоды  [new]
imv21
Member

Откуда:
Сообщений: 5
Добрый день, господа!
Подскажите, пожалуйста, как мне получить из набора

CREATE TABLE [#PlanYEAR] ([YYYY] SMALLINT NULL)

INSERT #PLANYEAR select NULL
INSERT #PLANYEAR select 2014
--INSERT #PLANYEAR select 2015
INSERT #PLANYEAR select 2016
--INSERT #PLANYEAR select 2017
INSERT #PLANYEAR select 2018
INSERT #PLANYEAR select 2019
INSERT #PLANYEAR select 2020

следующий результат :
2014,2016,2018-2020
11 ноя 13, 17:10    [15110507]     Ответить | Цитировать Сообщить модератору
 Re: Периоды  [new]
imv21
Member

Откуда:
Сообщений: 5
Пример 2:

INSERT #PLANYEAR select 2014
INSERT #PLANYEAR select 2015
INSERT #PLANYEAR select 2016
INSERT #PLANYEAR select 2017
--INSERT #PLANYEAR select 2018
INSERT #PLANYEAR select 2019
INSERT #PLANYEAR select 2020

следующий результат :
2014-2017,2019,2020
PS: Нужен универсальный код, который в зависимости от набора будет генерить результат
11 ноя 13, 17:14    [15110535]     Ответить | Цитировать Сообщить модератору
 Re: Периоды  [new]
qwerty112
Guest
imv21,

один из вариантов
select 
	case 
		when min([YYYY])=max([YYYY]) then cast(min([YYYY]) as varchar) 
			else cast(min([YYYY]) as varchar)+'-'+cast(min([YYYY]) as varchar) 
	end as xz
from (select *, row_number()over(order by [YYYY]) as rn from #PlanYEAR) a
group by [YYYY]-rn


он не самый быстрый, вдруг чо ...
11 ноя 13, 17:29    [15110652]     Ответить | Цитировать Сообщить модератору
 Re: Периоды  [new]
aleks2
Guest
declare @PlanYEAR TABLE ([YYYY] SMALLINT NULL)

INSERT @PLANYEAR select NULL
INSERT @PLANYEAR select 2014
--INSERT @PLANYEAR select 2015
INSERT @PLANYEAR select 2016
--INSERT @PLANYEAR select 2017
INSERT @PLANYEAR select 2018
INSERT @PLANYEAR select 2019
INSERT @PLANYEAR select 2020

declare @b table (Y SMALLINT, n int identity primary key clustered);
declare @e table (Y SMALLINT, n int identity primary key clustered);

insert @b(Y)
select [YYYY] 
  from @PLANYEAR p 
  where not exists(select * from @PLANYEAR pp where pp.YYYY = p.YYYY-1)
       and [YYYY] is not null
  order by [YYYY] ASC

select * from @b

insert @e(Y)
select [YYYY] 
  from @PLANYEAR p 
  where not exists(select * from @PLANYEAR pp where pp.YYYY = p.YYYY+1)
       and [YYYY] is not null
  order by [YYYY] ASC

select * from @e

select b.Y y1, e.Y y2
from @e e inner join @b b on e.n = b.n;
11 ноя 13, 17:30    [15110663]     Ответить | Цитировать Сообщить модератору
 Re: Периоды  [new]
Sergey S
Member

Откуда: Киев
Сообщений: 215
SELECT
YYYY
FROM #PLANYEAR
WHERE YYYY%2=0
11 ноя 13, 17:30    [15110667]     Ответить | Цитировать Сообщить модератору
 Re: Периоды  [new]
imv21
Member

Откуда:
Сообщений: 5
Спасибо всем за помощь,
Благодарю aleks2 за оптимальный вариант
14 ноя 13, 09:25    [15125786]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить