#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 сотрудник на каждом этапе без повторения.
Я выполнил процедуру с курсором, которая вставляет результат в другую таблицу, но проблема в том, что это дает неправильный результат, заключающийся в повторении клиента на этапе 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 ).