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

Откуда:
Сообщений: 32
Здравствуйте! Уважаемые! Помогите!

Есть табличка (данные выгружены из 1С) например Т1. В ней есть поле КОД - его значения:
А0000001
Б0000006
А0000008
00000009

нужно написать функцию чтобы в зависимости от передаваемого кода - она возвращала следующий
Предположим передали А0000001 - следующим будет А0000009 и так далее...

если бы коды были без префиксов - тут все просто:
select top 1 [kod] as nextkod from [OrderByClient] order by cast([kod] as int) desc;


но проблема что все коды разные и префиксы разные и к томуже не всегда в одну букву
напримар есть такие: ЧК--0008 (следующим будет ЧК--0009)...

мда.. моск уже сломал...

Заранее спасибо!
6 янв 13, 18:24    [13729358]     Ответить | Цитировать Сообщить модератору
 Re: Как получить следующий код?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6204
https://www.sql.ru/forum/actualthread.aspx?tid=415163
6 янв 13, 18:52    [13729410]     Ответить | Цитировать Сообщить модератору
 Re: Как получить следующий код?  [new]
qwerty112
Guest
Ъыжсло
Здравствуйте! Уважаемые! Помогите!

Есть табличка (данные выгружены из 1С) например Т1. В ней есть поле КОД - его значения:
А0000001
Б0000006
А0000008
00000009

нужно написать функцию чтобы в зависимости от передаваемого кода - она возвращала следующий
Предположим передали А0000001 - следующим будет А0000009 и так далее...

у тебя нет в таблице А0000009
6 янв 13, 18:52    [13729412]     Ответить | Цитировать Сообщить модератору
 Re: Как получить следующий код?  [new]
aleks2
Guest
Ъыжсло
и префиксы разные и к томуже не всегда в одну букву
напримар есть такие: ЧК--0008 (следующим будет ЧК--0009)...


declare @t1 table(kod char(8) primary key clustered)
insert @t1
values
('А0000001')
,('Б0000006')
,('А0000008')
,('00000009')

select SUBSTRING(kod, 1, PATINDEX('%[0-9]%', kod)-1 ) as prefix from @t1

declare @kod char(8) = 'А0000001';


select top 1 [kod] as nextkod 
from @t1 
where 
[kod] like SUBSTRING(@kod, 1, PATINDEX('%[0-9]%', kod)-1 )+'%'
and 
[kod] > @kod
order by [kod] asc;
7 янв 13, 12:23    [13731091]     Ответить | Цитировать Сообщить модератору
 Re: Как получить следующий код?  [new]
Ъыжсло
Member

Откуда:
Сообщений: 32
aleks2, отличный пример подумать.... но...
если взять вот такие начальные условия:

declare @t1 table(kod nvarchar(10))-- primary key clustered)
insert @t1
values
 ('A000000001')
,('B000000006')
,('A000000008')
,('Z-00000001')
,('0000001009')
,('0000002009')
,('0000003009')
,('F000000009')
,('Z-00000009')
,('Z-00000015')

select SUBSTRING(kod, 1, PATINDEX('%[0-9]%', kod)-1 ) as prefix from t1

declare @kod nvarchar(10) = 'Z-00000001';

select top 1 [kod] as nextkod 
from t1 
where 
[kod] like SUBSTRING(@kod, 1, PATINDEX('%[0-9]%', kod)-1 )+'%'
and 
[kod] > @kod
order by [kod] asc;


РЕЗУЛЬТАТ ЗАПРОСА: Z-00000009 а нужно чтобы получилось Z-00000016
7 янв 13, 13:11    [13731198]     Ответить | Цитировать Сообщить модератору
 Re: Как получить следующий код?  [new]
Ъыжсло
Member

Откуда:
Сообщений: 32
ДА-да! я не ошибся именно Z-00000016 потому что это и есть следующий код с префиксом Z-
7 янв 13, 13:13    [13731204]     Ответить | Цитировать Сообщить модератору
 Re: Как получить следующий код?  [new]
aleks2
Guest
Ъыжсло
ДА-да! я не ошибся именно Z-00000016 потому что это и есть следующий код с префиксом Z-

Слюшай, дарагой! Как тока ты розжуваешь в какой системе счисления за 1 (адын) следует 16 (шишнадцать) и тока потом 9 (девять)... я тибе фсе зделаю. В лучшем виде.
7 янв 13, 15:31    [13731726]     Ответить | Цитировать Сообщить модератору
 Re: Как получить следующий код?  [new]
Ъыжсло, угадано?
Guest
aleks2,

Ъыжсло желает, чтоб была группировка по префиксу, в группе выбрать макс. значение и к нему 1 прибавить.
типа для Z-00000001:

группа:
Z-00000001
Z-00000009
Z-00000015

макс. Z-00000015
и след. Z-00000016

Ъыжсло, угадано?
7 янв 13, 15:54    [13731802]     Ответить | Цитировать Сообщить модератору
 Re: Как получить следующий код?  [new]
Glory
Member

Откуда:
Сообщений: 104751
declare @t1 table(kod nvarchar(10))-- primary key clustered)
insert @t1
values
 ('A000000001')
,('B000000006')
,('A000000008')
,('Z-00000001')
,('0000001009')
,('0000002009')
,('0000003009')
,('F000000009')
,('Z-00000009')
,('Z-00000015')
,('ZZZZZZ')


select *, z+right(replicate('0',100)+cast(y as varchar),LEN(x)) as new
 from(
select *, cast(x as bigint)+1 as y, LEFT(kod,LEN(kod)-LEN(x)) as z
from(
select *,SUBSTRING(kod, NULLIF(PATINDEX('%[0-9]%', kod),0),8000) as x
from @t1 
) a
) b
7 янв 13, 18:04    [13732227]     Ответить | Цитировать Сообщить модератору
 Re: Как получить следующий код?  [new]
Ъыжсло
Member

Откуда:
Сообщений: 32
Ъыжсло, угадано?
aleks2,

Ъыжсло желает, чтоб была группировка по префиксу, в группе выбрать макс. значение и к нему 1 прибавить.
типа для Z-00000001:

группа:
Z-00000001
Z-00000009
Z-00000015

макс. Z-00000015
и след. Z-00000016

Ъыжсло, угадано?


верно угадано )
7 янв 13, 18:51    [13732405]     Ответить | Цитировать Сообщить модератору
 Re: Как получить следующий код?  [new]
Ъыжсло
Member

Откуда:
Сообщений: 32
Glory
declare @t1 table(kod nvarchar(10))-- primary key clustered)
insert @t1
values
 ('A000000001')
,('B000000006')
,('A000000008')
,('Z-00000001')
,('0000001009')
,('0000002009')
,('0000003009')
,('F000000009')
,('Z-00000009')
,('Z-00000015')
,('ZZZZZZ')


select *, z+right(replicate('0',100)+cast(y as varchar),LEN(x)) as new
 from(
select *, cast(x as bigint)+1 as y, LEFT(kod,LEN(kod)-LEN(x)) as z
from(
select *,SUBSTRING(kod, NULLIF(PATINDEX('%[0-9]%', kod),0),8000) as x
from @t1 
) a
) b


Спасибо за наводочку ) Вот тут уже есть что покурить... Хотя получаемая таблица не есть то что нужно (ф-ция должна возвращать скаляр) но идея в целом ясна ))) %beer%
7 янв 13, 18:53    [13732408]     Ответить | Цитировать Сообщить модератору
 Re: Как получить следующий код?  [new]
Ъыжсло
Member

Откуда:
Сообщений: 32
aleks2
Ъыжсло
ДА-да! я не ошибся именно Z-00000016 потому что это и есть следующий код с префиксом Z-

Слюшай, дарагой! Как тока ты розжуваешь в какой системе счисления за 1 (адын) следует 16 (шишнадцать) и тока потом 9 (девять)... я тибе фсе зделаю. В лучшем виде.


ЖЖОШЬ Дарагой, да?
7 янв 13, 18:55    [13732413]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить