2016-11-14 7 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クエリ -</p> <p><a href="https://i.stack.imgur.com/buP9r.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/buP9r.jpg" alt="enter image description here"></a></p> <p>注 - 複数のテーブル

- -

追加テーブル

1)agent_no上(通話テーブルを結合して、従業員による参加と集計通話や販売)およびJDEの販売( )テーブル

2)すべての日付にコールと販売の両方が含まれるわけではないため、日付ディメンションテーブルを使用してすべての日付が表示されるようにします。

望ましい結果は次のようになります -

enter image description here

クエリは、私が実行を書いた - それはとても長い時間がかかる私は、クエリをキャンセル終わります。

ご協力いただければ幸いです。

+0

これらの各テーブルには、およそいくつの行がありますか? – mendosi

+0

コールテーブルは約800k、年間売上データテーブルは約400kです。 – 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

関連する問題

 関連する問題