У меня есть список контейнеров (более 2 тыс. строк), которые я хочу разбить на несколько частей.
Code Name Compartments
10 10 feet 1
15 15 feet 1
25 25 feet 2
100 100 feet 3
150 150 feet 2
Я сделал этот запрос, чтобы добиться этого
select *
from Containers c
inner join master.dbo.spt_values b on b.type = 'P' and b.number < c.Compartments
Получить
Code Name Compartments
10 10 feet 1
15 15 feet 1
25 25 feet 2
25 25 feet 2
100 100 feet 3
100 100 feet 3
100 100 feet 3
150 150 feet 2
150 150 feet 2
Теперь я хочу добавить автоинкрементную букву в код, но для каждой группы, как это.
Code Name Compartments
10A 10 feet 1
15A 15 feet 1
25A 25 feet 2
25B 25 feet 2
100A 100 feet 3
100B 100 feet 3
100C 100 feet 3
150A 150 feet 2
150B 150 feet 2
Я думал использовать количество отсеков или добавить столбец идентификаторов, чтобы добавить инкрементный символ (64), но я не могу понять, как сделать инкрементный для каждой группы
select Code + CHAR(Compartments + 64), *
from Containers c inner join master.dbo.spt_values b on b.type = 'P' and
b.number < c.Compartments
Вы не думали этого делать? Честно говоря, «наращивание» письма чревато проблемами. Что будет, когда тебе исполнится 27? У вас сейчас есть АА? Как вы собираетесь сортировать их, когда AA должно идти после Z? Как насчет множества комбинаций, которые вам действительно не нужны. Например, что будет после FUJ? Или после ШЭВ? Сколько еще можно составить комбинаций из 2-3 букв, которые нужно исключить??? А объединение существующего и другого значения в один и тот же кортеж нарушает 1НФ, то есть должно быть два столбца.
это сработает для вас, но не забудьте проверить после 26, что произойдет, когда вы достигнете «Z».
select Code + CHAR(ROW_NUMBER() OVER(PARTITION BY code ORDER BY name ASC) + 64), *
from Containers c inner join master.dbo.spt_values b on b.type = 'P' and
b.number < c.Compartments
Это сработает, но, как заметил Шон, это плохой дизайн В самом деле.
Вы думали об использовании
ROW_NUMBER
?