2016-11-14 5 views
1
select D.[Date], E.emp_name, E.emp_jde, count(C.[agent_no]) calls, count(S.[EMPJDENUM]) sales 
from 
(select cast([start_date] as date) dte, [agent_no] 
from call_table 
where [skill_name] like '%5700 sales l%' 
and [Agent_Time] != '0' 
) C 
full outer join 
(select [AC#DTE_dt], [EMPJDENUM] 
from sales_table 
where [ICGCD2] in ('LAWN', 'HORT') 
and [CHANNEL]= 'INQ' 
and [ITMQTY]>3 
) S on c.dte=s.[AC#DTE_dt] 
right join 
(select [Date] 
from Date_table 
) D on c.dte=d.[Date] or s.[AC#DTE_dt]=d.[Date] 
right join 
(select [emp_name], [emp_jde], [agent_no] 
from Employee_table 
) E on C.[agent_no]=E.agent_no and S.[EMPJDENUM]=E.emp_jde 
group by D.[Date], E.emp_name, E.emp_jde 

Дата Таблицы -SQL запросов - Группировка/Агрегирование по нескольким таблицам

enter image description here

Примечание: Не все даты будут иметь оба позывных и продаж.

Дополнительные таблицы -

Что должно быть достигнуто -

1) Регистрация и Совокупные звонки и продажи по Работника, присоединившись к таблице вызовов (на agent_no) и продаж (на JDE) Таблица

2) Поскольку не все даты будут включать в себя как звонки, так и продажи, используйте таблицу размеров даты, чтобы обеспечить представление всех дат.

Желаемый результат будет выглядеть следующим образом -

enter image description here

Запрос я писал Выполняет - это занимает так много времени, я просто в конечном итоге отмены запроса.

Любая помощь будет оценена по достоинству.

+0

Приблизительно сколько строк в каждой из этих таблиц? – mendosi

+0

Таблица вызовов будет иметь около 800 тыс., А таблица продаж - около 400 тыс. В год. – user3067478

+0

Не могли бы вы включить оценочный план выполнения, пожалуйста, https://www.brentozar.com/pastetheplan/ – mendosi

ответ

0

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

  1. удалить ведущую подстановочные в where [skill_name] like '5700 sales l%'
  2. поставил group by в подзапросы

У меня есть пример, который реализует обе эти функции. (Обратите внимание, что я сделал некоторые переформатирования просто попытаться понять, что ваш запрос делает.)

select D.[Date], E.emp_name, E.emp_jde, C.Calls, S.Sales 
    from Date_table As D 
    Left Join (
    select cast([start_date] as date) As CallDate, [agent_no], Count(*) As Calls 
     from call_table 
     where [skill_name] like '5700 sales l%' 
     and [Agent_Time] != '0' 
     Group By Cast([start_date] As date), [agent_no]) As C On D.[Date] = C.CallDate 
    Left Join (
    select [AC#DTE_dt] As SaleDate, [EMPJDENUM], Count(*) As Sales 
     from sales_table 
     where [ICGCD2] in ('LAWN', 'HORT') 
     and [CHANNEL]= 'INQ' 
     and [ITMQTY]>3 
     Group By [AC#DTE_dt], [EMPJDENUM]) As S on D.[Date] = s.SaleDate 
    right join Employee_table As E 
    on C.[agent_no]=E.agent_no 
    and S.[EMPJDENUM]=E.emp_jde; 

Редактировать

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

select D.[Date], E.emp_name, E.emp_jde, C.Calls, S.Sales 
    from Date_table As D, 
     Employee_table as E 
    Left Join (
    select cast([start_date] as date) As CallDate, [agent_no], Count(*) As Calls 
     from call_table 
     where [skill_name] like '5700 sales l%' 
     and [Agent_Time] != '0' 
     Group By Cast([start_date] As date), [agent_no]) As C 
    On D.[Date] = C.CallDate 
    And E.agent_no = C.agent_no 
    Left Join (
    select [AC#DTE_dt] As SaleDate, [EMPJDENUM], Count(*) As Sales 
     from sales_table 
     where [ICGCD2] in ('LAWN', 'HORT') 
     and [CHANNEL]= 'INQ' 
     and [ITMQTY]>3 
     Group By [AC#DTE_dt], [EMPJDENUM]) As S 
    on D.[Date] = s.SaleDate 
    and E.emp_jde = S.[EMPJDENUM]; 
+0

Это очень близко - то, что происходит, есть, если кто-то звонит без продажи или продаж без звонков на определенный день, это оставляя их вне результатов. – user3067478

+0

И этот запрос работает эффективно. – user3067478

+0

@ user3067478 Я внес некоторые корректировки, которые должны возвращать строки даже там, где нет продаж или звонков – mendosi

Смежные вопросы