Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 2
  • 149

Potrzebujemy wygenerować harmonogram kontaktów z klientami dla naszych pracowników tak, aby każdy doradca miał przypisaną codziennie taką samą ilość klientów, których ma obsłużyć. Konsultant ma otrzymywać w ramach harmonogramu tylko "swoich" klientów tj. przypisanych do niego. W pierwszej kolejności powinien obsłużyć klientów, z którymi nie podejmował jeszcze kontaktu, a następnie tych, z którymi kontakt podejmowany był najdawniej. Zapytanie powinno być na tyle elastyczne, aby pozwalało na zmianę ilości przypisanych na dany dzień klientów.

Uczestnik szkolenia
  • Zapytał
  • @ Uczestnik szkolenia | 01.04.2014

Odpowiedź (1)

  • 3

Najpierw utworzymy tabele przechowujące demonstracyjne dane dotyczące klientów i doradców/handlowców:

 

 

create table doradcy (
       dor_id number primary key,
       dor_nazwisko varchar2(100) not null
);

create table klienci (
       klt_id number primary key,
       klt_nazwisko varchar2(100),
       klt_data date,
       klt_dor_id number references doradcy (dor_id)       
);

 

 

Tabele są uproszczone do niezbędnego minimum. Klienci zawierają jedynie identyfikator, nazwisko, datę ostatniego kontaktu handlowca oraz klucz obcy wskazujący na handlowca do którego są przypisani.

Następnie wypełnimy tabele danymi. W tym celu utworzymy 3 doradców:

 

 

-- inicjalne zasilenie tabeli doradców
insert into doradcy values (1,'Kevin Costner');
insert into doradcy values (2,'Mighty Duck');
insert into doradcy values (3,'Woody Allen');
commit;

 

 

Oraz wygenerujemy przy pomocy PL/SQL setkę przykładowych klientów (zakładamy w przykładzie równą dystrybucję klientów do doradców) :

 

 

-- utworzenie 100 klientów i ich dystrybucja do doradców
declare
  n simple_integer := 0;
begin
  for i in 1..100 loop
      n := n+1;     
         insert into klienci values (i,'Klient NR'||i,null,n);
      if n > 2 then n := 0;
      end if;
  end loop;
end;
/

 

 

Kolejnym krokiem jest wygenerowanie dla połowy klientów dat poprzedniego kontaktu:

 

 

-- wstawianie wstecznych dat poprzedniego kontaktu u połowy klientów
declare
  x simple_integer := 1;
begin
  for i in 1..100 loop
      if mod(i,2)=0 then 
        update klienci set klt_data = sysdate-x
         where klt_id = i;
        x := x+1;
      end if;
  end loop;
end;

 

 

Na koniec właściwe zapytanie tworzące harmonogram:

 

 

select sysdate+ceil(row_number() over (partition by konsultant order by kontakt nulls first)/&ilość_zleceń)-1 
       data_kontaktu,
       konsultant, 
       klient,
       kontakt poprzedni_kontakt
  from (
        select d.dor_nazwisko konsultant, 
               k.klt_nazwisko klient, 
               k.klt_data kontakt
          from klienci k join doradcy d on dor_id = klt_dor_id
         )
 order by data_kontaktu, konsultant;

 

 

  • Odpowiedział
  • @ | 01.04.2014
  • TRENER MODERATOR ALTKOM AKADEMII