Как увеличить буквенно-цифровое значение

У меня есть таблица, содержащая более 200 элементов. Я хочу перечислить их и назначить код группы для каждых 5 элементов. Например

GroupCode    Item
GC-01        ITEM-A
GC-01        ITEM-B
GC-01        ITEM-C
GC-01        ITEM-D
GC-01        ITEM-E
GC-02        ITEM-F
GC-02        ITEM-G
GC-02        ITEM-H

После каждых 5 элементов GroupCode следует добавлять 1 в цифровую часть буквенно-цифрового кода.

SELECT 'GC-01' "GroupCode", ITEM_NUMBER "Item" FROM ITEMS;

С этим кто-нибудь может помочь?


person Muhammad Asim    schedule 02.09.2020    source источник
comment
[Это](stackoverflow .com/questions/42137625/ может помочь в вашем сценарии)   -  person saikumar voruganti    schedule 02.09.2020
comment
Взгляните сюда, аналогичный сценарий в оракуле: stackoverflow.com/questions/22414541/   -  person Velocity    schedule 02.09.2020


Ответы (3)


Что-то вроде этого должно помочь:

select
    ITEM_NUMBER,
    1 + ( ROW_NUMBER() over (order by ITEM_NUMBER) - 1) / 5 as GROUP_NUMBER
from
    ITEMS

Это дает вам номер группы, который вы хотите; вы можете дополнить это начальным нулем, если необходимо, возможно, используя LPAD, и добавить «GC» в начало.

К вашему сведению, функция ROW_NUMBER() в этом случае просто предоставляет порядковый номер, полученный путем упорядочения ITEM_NUMBER в алфавитном порядке. Мы вычитаем из него 1, чтобы последовательность начиналась с 0. Затем мы делим это на 5, и результат округляется до ближайшего целого числа, что дает нам отличное число для каждых 5 элементов (начиная с 0, но вы хотите чтобы начать с 1, поэтому мы добавляем 1 к результату).

person Nabav    schedule 02.09.2020

Запрос, подобный приведенному ниже, должен дать вам 5 элементов для каждого группового кода. Это распечатает только групповые коды от GC-01 до GC-99. Если вам нужен номер группы выше 99, вам нужно настроить маску формата.

WITH
    items (item)
    AS
        (SELECT 'ITEM-A' FROM DUAL
         UNION ALL
         SELECT 'ITEM-B' FROM DUAL
         UNION ALL
         SELECT 'ITEM-C' FROM DUAL
         UNION ALL
         SELECT 'ITEM-D' FROM DUAL
         UNION ALL
         SELECT 'ITEM-E' FROM DUAL
         UNION ALL
         SELECT 'ITEM-F' FROM DUAL
         UNION ALL
         SELECT 'ITEM-G' FROM DUAL
         UNION ALL
         SELECT 'ITEM-H' FROM DUAL)
SELECT item, 'GC-' || TO_CHAR (CEIL (ROWNUM / 5), 'FM00') AS groupcode
  FROM items;
person EJ Egyed    schedule 02.09.2020

Это можно легко сделать на 12c и более поздних версиях, как показано ниже:

select * from items
match_recognize
(
 order by item
 measures 'GC-'||to_char(match_number(),'fm00') as new_group_code
 all rows per match
 pattern ( a+ )
 define a as count(*) < = 5
);
person Ranagal    schedule 02.09.2020