С таблицами
CREATE TABLE ctab (id int,rate varchar(1)); -- claims table
INSERT INTO ctab (id,rate) VALUES
(1, 'N'),(2, 'N'),(3, 'N'),(4, 'F'),(5, 'N'),
(6, 'D'),(7, 'D'),(8, 'F'),(9, 'L');
CREATE TABLE rtab(id int,rate varchar(1), ratevale varchar(2));
INSERT INTO rtab (id,rate,ratevale) VALUES -- rates table
(1, 'N', 'NA'),(2, 'D', 'DH'),(3, 'F', 'FA'),(4, 'L', 'LD');
мы можем сделать следующее:
SELECT t.id, CONCAT(ratevale,'-40-',RIGHT(CAST(i+1000 as char(4)),3)) rval
FROM (
SELECT CASE WHEN @r =rate THEN @i:[email protected]+1 ELSE @i:= 1 END i,
CASE WHEN @r!=rate THEN @r:=rate ELSE @r END r,
id id,rate rate
FROM (SELECT @i:=1,@r:='') v, ctab c
ORDER BY rate,id
) t
INNER JOIN rtab r ON r.rate=t.rate
ORDER BY id
и мы получаем:
| id | rval |
|----|-----------|
| 1 | NA-40-001 |
| 2 | NA-40-002 |
| 3 | NA-40-003 |
| 4 | FA-40-001 |
| 5 | NA-40-004 |
| 6 | DH-40-001 |
| 7 | DH-40-002 |
| 8 | FA-40-002 |
| 9 | LD-40-001 |
поиграйте с ним здесь: http://sqlfiddle.com/#!9/d9e3e/15
Основная идея заключается в том, что мы перечисляем таблицу претензий, заказанный rate
и превратить его в производную таблицу t
.
После инициализирован @i
к 1
и @r
к ''
в производной таблице v
мы проверяем ли @r=rate
и
- если да, то мы увеличиваем
@i
.
- в противном случае (
ELSE
) мы сбрасываем @i
в 1
и @r
в rate
. Это происходит во втором предложении CASE
.
В итоге получится столбец последовательностей i
, который начинает подсчет для каждого значения rate
. В внешнем заявлении SELECT
производная таблица t
затем соединяется с таблицей тарифов rtab
и применяется другой порядок сортировки.
Обратите внимание:
Это решение также можно рассматривать в качестве альтернативного решения ROW_NUMBER() in MySQL. Вышеупомянутый запрос MySQL можно легко переписать в MSSQL, применив row_number() over (partition...)
, см. Здесь: http://sqlfiddle.com/#!3/d9e3e/8
Каковы значения '40' и' 00x' в столбце «Создать»? – Chris
40 является статическим значением и 00x идентификатор необходимо сгенерировать – user2725587