CHill60
Как отметил Йорген Андерссон, вы, вероятно, захотите заменить жестко закодированное "2018" годом, извлеченным из чего-то. Это также выглядит так, как будто вы можете начать перенумеровку для каждого года.
Что-то вроде этого работает (но предполагает, что никакие записи не будут удалены)..
Я создал и заполнил временную таблицу для демо таким образом:
create table #ticket
(
[No] int identity(1,1),
[year] int
)
insert into #ticket ([year]) values
(2017),(2017),(2018),(2018),(2018),(2019),(2019)
-- NB - and some more
insert into #ticket ([year]) values
(2017),(2017),(2018),(2018),(2018),(2019),(2019)
Обратите внимание, что
year
s не появляются в "правильном" порядке, если вы заказываете только по
[No]
колонка.
Такой запрос как этот:
select [No], [Year], 'TS-' + cast([year] as char(4)) + '-' + CAST(ROW_NUMBER() OVER (PARTITION BY [year] ORDER BY [No]) as varchar)
from #ticket order by [year], [No]
дал мне эти результаты:
1 2017 TS-2017-1
2 2017 TS-2017-2
8 2017 TS-2017-3
9 2017 TS-2017-4
3 2018 TS-2018-1
4 2018 TS-2018-2
5 2018 TS-2018-3
10 2018 TS-2018-4
11 2018 TS-2018-5
12 2018 TS-2018-6
6 2019 TS-2019-1
7 2019 TS-2019-2
13 2019 TS-2019-3
14 2019 TS-2019-4
или немного лучше (на мой взгляд)
;with c as (
select [No], [Year],
ROW_NUMBER() OVER (PARTITION BY [year] ORDER BY [No]) as yno from #ticket
)
select [No], [Year], Format([Year], 'TS-####') + Format(yno, '-####') from c
Но, как я уже говорил ранее, часто такого рода манипуляции (форматирование текста и цифр) лучше всего оставить на уровне пользовательского интерфейса