Добавление нового столбца, который автоматически увеличивается на основе существующих значений поля - PullRequest
1 голос
/ 08 ноября 2019

Не знаю, как это сделать, но я хочу добавить новый столбец "Джерси", который будет увеличиваться на 1 в зависимости от значения "Спорт" как в tab_A, так и в tab_B. Так что, если "tab" уже существует в tab_B, просто возьмите max jersey_no и добавьте 1 для нового столбца. Это легко.

Теперь, если "Sport" не существует в tab_B, тогда присвойте ему значение "Джерси" 100 для нового столбца. Однако, если в tab_A имеется более одного «Sport» (но не существует в tab_B), он должен начинаться со 100 и увеличиваться на 1 для следующего же Sport и т. Д. (Например, см. Пример Garcia ниже).

Я создал последовательность "seqnce", но это действительно не помогло. Есть ли другой способ сделать это? Заранее спасибо!

Tab_A

 Name       State       Sport           
 Garcia      CA         Basketball      
 Garcia      AL         Basketball      
 Garcia      NY         Basketball      
 McGee       CA         Swimming        
 Tontou      CA         Football        
 Tontou      AL         Swimming        

Tab_B

 Name     Sport         Jersey_No
 Garcia   Swimming      100
 Garcia   Football      100
 McGee    Swimming      101
 Tontou   Swimming      101
 Tontou   Swimming      102

Ожидаемый результат

 Name       State       Sport           Jersey
 Garcia      CA         Basketball      100
 Garcia      AL         Basketball      101
 Garcia      NY         Basketball      102
 McGee       CA         Swimming        102    
 Tontou      CA         Football        100
 Tontou      AL         Swimming        103

Мой код

select name, state, sport
      ,nvl ((select max(b.jersey_no + 1) from tab_b b
                where b.sport = a.sport
                and   b.name = a.name),
        (case
        when not exists (select 1 from tab_b b 
                where b.sport = a.sport
                and   b.name = a.name
                having count(a.sport) > 1) 
        then seqnce.nextval 
        else '100'
        end )
        ) Jersey
from tab_a

1 Ответ

1 голос
/ 08 ноября 2019

Если это только результат выбора, то с помощью row_number (). Если вам нужно обновить столбец в таблице, запишите триггер

Пример этого:

WITH taba AS
(SELECT 'Garcia'  Name,     'CA'  State,       'Basketball'  Sport  from dual
UNION ALL
SELECT 'Garcia'  Name,     'AL'  State,       'Basketball'  Sport  from dual
UNION ALL
SELECT 'Garcia'  Name,     'NY'  State,       'Basketball'  Sport  from dual 
UNION ALL
SELECT 'McGee'  Name,     'CA'  State,       'Swimming'  Sport  from dual 
UNION ALL
SELECT 'Tontou'  Name,     'CA'  State,       'Football'  Sport  from dual
UNION ALL
SELECT 'Tontou'  Name,     'AL'  State,       'Swimming'  Sport  from dual),
tabb AS
(SELECT 'Garcia'  Name,  'Swimming'  Sport, 100 Jersey   from dual
UNION ALL
SELECT 'Garcia'  Name,  'Football',   100 from dual
UNION ALL
SELECT 'McGee'  Name,  'Swimming',   101 from dual 
UNION ALL
SELECT 'Tontou'  Name,  'Swimming', 101 from dual
UNION ALL
SELECT 'Tontou'  Name,  'Swimming', 102 from dual)
SELECT taba.Name, 
taba.State ,  
taba.Sport,  
row_number() over(partition by taba.Name,  taba.Sport ORDER BY taba.State) 
            + nvl((SELECT MAX(tabb.Jersey) 
                    FROM tabb
                    WHERE taba.name = tabb.name 
                    AND taba.sport = tabb.sport), 99) 
FROM taba

результат:

Garcia  AL  Basketball  100
Garcia  CA  Basketball  101
Garcia  NY  Basketball  102
McGee   CA  Swimming    102
Tontou  CA  Football    100
Tontou  AL  Swimming    103
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...