Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как SQL`но посчитать контрольный разряд к СНИЛС? / 7 сообщений из 7, страница 1 из 1
05.03.2015, 15:58
    #38896211
СНИЛС
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как SQL`но посчитать контрольный разряд к СНИЛС?
Есть таблица с СНИЛС без контрольного разряда. Необходимо посчитать его и заменить данные в поле. Поделитесь каким-нибудь примером охватывающим сабж для воровства оного и изучения.
...
Рейтинг: 0 / 0
05.03.2015, 16:30
    #38896278
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как SQL`но посчитать контрольный разряд к СНИЛС?
СНИЛС,

Считать так: http://www.genon.ru/GetAnswer.aspx?qid=050358a0-f860-40ef-bca8-804da685512f
Изменить в поле - через UPDATE вестимо
...
Рейтинг: 0 / 0
05.03.2015, 16:56
    #38896325
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как SQL`но посчитать контрольный разряд к СНИЛС?
СНИЛС,

судя по вики , как-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
with recursive
s1 as (
  select '112-233-445 95' as snils from rdb$database union all
  select '165-300-180 28' from rdb$database union all
  select '999-999-999 95' from rdb$database
)
,s2 as (
  select s1.snils, replace(substring(s1.snils from 1 for 11),'-','') n, right(s1.snils,2) to_check
  from s1
)
,r as(
  select 1 i from rdb$database union all select r.i+1 from r where r.i<9
)
,c as (
    select
         s2.snils
        ,s2.n
        ,s2.to_check
        ,sum((10-r.i) * cast( substring(s2.n from r.i for 1) as smallint )) dsum
    from s2 cross join r
    group by s2.snils,s2.n,s2.to_check
)
,d as (
    select
     c.snils
    ,c.n
    ,c.to_check
    ,iif( c.dsum < 100, c.dsum, iif(c.dsum in(100,101), 0,  coalesce(nullif(mod(c.dsum, 101), 100),0)  ) ) checked
    from c
)
select d.snils, d.to_check, d.checked, iif(d.to_check = d.checked, 'ok', 'x') result
from d;
Output sample:
SNILSTO_CHECKCHECKEDRESULT112-233-445 959595ok165-300-180 282828ok999-999-999 95951x
...
Рейтинг: 0 / 0
05.03.2015, 16:58
    #38896328
СНИЛС
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как SQL`но посчитать контрольный разряд к СНИЛС?
Таблоид, ужос! распечатал, пошел "курить"...
...
Рейтинг: 0 / 0
05.03.2015, 18:56
    #38896487
Шавлюк Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как SQL`но посчитать контрольный разряд к СНИЛС?
Таблоид
Код: plaintext
1.
    ,iif( c.dsum < 100, c.dsum, iif(c.dsum in(100,101), 0,  coalesce(nullif(mod(c.dsum, 101), 100),0)  ) ) checked

можно заменить на
Код: sql
1.
    ,coalesce(nullif(mod(c.dsum, 101), 100), 0) checked
...
Рейтинг: 0 / 0
17.07.2015, 22:55
    #39010300
FedorinoFF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как SQL`но посчитать контрольный разряд к СНИЛС?
ТаблоидСНИЛС,

судя по вики , как-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
with recursive
s1 as (
  select '112-233-445 95' as snils from rdb$database union all
  select '165-300-180 28' from rdb$database union all
  select '999-999-999 95' from rdb$database
)
,s2 as (
  select s1.snils, replace(substring(s1.snils from 1 for 11),'-','') n, right(s1.snils,2) to_check
  from s1
)
,r as(
  select 1 i from rdb$database union all select r.i+1 from r where r.i<9
)
,c as (
    select
         s2.snils
        ,s2.n
        ,s2.to_check
        ,sum((10-r.i) * cast( substring(s2.n from r.i for 1) as smallint )) dsum
    from s2 cross join r
    group by s2.snils,s2.n,s2.to_check
)
,d as (
    select
     c.snils
    ,c.n
    ,c.to_check
    ,iif( c.dsum < 100, c.dsum, iif(c.dsum in(100,101), 0,  coalesce(nullif(mod(c.dsum, 101), 100),0)  ) ) checked
    from c
)
select d.snils, d.to_check, d.checked, iif(d.to_check = d.checked, 'ok', 'x') result
from d;
Output sample:
SNILStTO_CHECKtCHECKEDtRESULT112-233-445 95t95t95tok165-300-180 28t28t28tok999-999-999 95t95t1tx

На FB 2.5 получил:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
CTE 'R' has cyclic dependencies.

Что не так сделал?
...
Рейтинг: 0 / 0
17.07.2015, 22:59
    #39010302
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как SQL`но посчитать контрольный разряд к СНИЛС?
FedorinoFF,

обновитесь до последнего ФБ. Там в парсинге рекурсивных запросов было "что-то" до 2.5.3 (вроде).
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как SQL`но посчитать контрольный разряд к СНИЛС? / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]