Oracle SQL: разделил одну строку на другую строку в другой таблице без репатриации, зависящей от значения переменной

#sql #oracle #plsql #plsqldeveloper

#sql #Oracle #plsql #plsqldeveloper

Вопрос:

У меня есть таблица tow :

Клиент :

 name
-----
TOMMY 
LOUIE 
HUGO 
OLLIE 
DAVID 
LEWIS 
JACKSON 
  

Сотрудники :

 name     | stage
--------- ---------
OLIVER   |  1
NOAH     |  1
ALFIE    |  1
OSCAR    |  2
NOAH     |  2
OLIVER   |  2
LEO      |  2
  

В Employee у меня есть два этапа. На каждом этапе могут ли у него быть одни и те же сотрудники или разные, что я хочу разделить или распределить клиента между сотрудниками с двумя условиями :

  1. у клиента на первом этапе должен быть другой сотрудник на втором этапе
  2. у каждого сотрудника должно быть одинаковое количество клиентов на каждом этапе, и у каждого клиента должен быть 1 сотрудник на каждом этапе без повторения.

Я выполнил процедуру с курсором, которая вставляет результат в другую таблицу, но проблема в том, что это дает неправильный результат, заключающийся в повторении клиента на этапе 1 тому же сотруднику на этапе 2 (например, НОА берет того же клиента)

 CREATE  PROCEDURE AUDIT_Customer   AS

CURSOR Customer_STAGE1 IS SELECT * FROM (
                select
                      s.name  Customer_name
                      ,t.name Employees_name 
                from (select name, row_number() over(order by name) as rn from Employees  WHERE stage = 1 ) t
                join (select name, row_number() over(order by name) as rn from Customer  ) s
                on mod(s.rn - 1, (select count(*) from Employees WHERE stage = 1)) = t.rn -1); 


CURSOR Customer_STAGE2 IS SELECT * FROM (
                select
                      s.name  Customer_name
                      ,t.name Employees_name 
                from (select name, row_number() over(order by name) as rn from Employees  WHERE stage = 2 ) t
                join (select name, row_number() over(order by name) as rn from Customer   ) s
                on mod(s.rn - 1, (select count(*) from Employees WHERE stage = 2)) = t.rn -1);                 


Begin 
      For y in  Customer_STAGE1 Loop

             Insert  into Customer_Employee(Customer_name,Employees_name,RECIVE_DATE,stage)
             Values  (Y.Customer_name ,Y.Employees_name,sysdate,1) ;

      End Loop ;

       For y in  Customer_STAGE2 Loop

             Insert  into Customer_Employee(Customer_name,Employees_name,RECIVE_DATE,stage)
             Values  (Y.Customer_name ,Y.Employees_name,sysdate,2) ;

      End Loop ;


   COMMIT;               
End AUDIT_Customer;
  

результаты :

     Customer| Employees| stage
    -------- ---------  ---------
    TOMMY   | OLIVER   |  1
    LOUIE   | OLIVER   |  1
    HUGO    | NOAH     |  1
    OLLIE   | NOAH     |  1
    DAVID   | ALFIE    |  1
    LEWIS   | ALFIE    |  1
    JACKSON | ALFIE    |  1
    TOMMY   | OSCAR    |  2
    LOUIE   | OSCAR    |  2
    HUGO    | NOAH     |  2
    OLLIE   | NOAH     |  2
    DAVID   | OLIVER   |  2
    LEWIS   | OLIVER   |  2
    JACKSON | LEO      |  2
  

как я могу это решить?

Комментарии:

1. Вы используете MySQL или Oracle?

2. использование Oracle sql

Ответ №1:

отфильтруйте второй раздел вашей процедуры, это может помочь:

 (select name, row_number() over(order by name) as rn from Employees  WHERE stage = 2 and Employee.Name not in (select Employee.Name from Employee WHERE stage = 1))
  

Комментарии:

1. это не работает .. это игнорирует сотрудников, как на этапе 1, так и на этапе 2 (например, NOAH ).