SQL Server查询 - 缺少数据

时间:2016-11-15 21:41:43

标签: sql-server tsql subquery case aggregate

我的查询结果中排除了数据存在问题 -

select 
    D.[Date], D.MonthName, D.WeekOfYear, 
    E.bu_name, E.emp_mgr, E.emp_sup, E.emp_name, E.emp_jde, 
    C.Calls, S.sales
from 
    DATE TABLE As D
join 
    (Select 
         cast([start_date] as date) as call_date, [agent_no], 
         sum(case when [skill_name] like '5700 Sales l%' and [Agent_Time] != '0' then 1 else 0 end) as calls
     from 
         CALL TABLE
     group by 
         cast([start_date] as date), [agent_no]) As C on D.[Date] = C.call_date
join 
    (Select 
         [AC#DTE_dt] As sale_date, [EMPJDENUM], 
         sum(case when [CH]='I' and ([IC]='L' or [IC]='H') and [ITMQTY]>3 and [EMPBUNCOD] in ('5044', '5077', '5169', '5178', '5179', '5186', '5187', '5189', '5190') then 1 else 0 end) as sales
     from 
         SALE TABLE
     group by 
         [AC#DTE_dt], [EMPJDENUM]) As S on D.Date = s.sale_date
join 
    EMPLOYEE TABLE As E on C.[agent_no] = E.[emp_vcc]
                        and S.[EMPJDENUM] = E.emp_jde
                        and S.sale_date between E.start_date and E.end_date
where 
    D.[Date] = '11/5/2016'

结果

enter image description here

如果调用或销售子查询表与employee表的匹配,如在查询底部的Employee表的连接中定义的那样 - 来自总和的聚合(将返回的情况。如果出于某种原因,在调用或销售子查询中没有要加入的数据,该行被排除。我想要的是结果返回0或null。

有什么想法?

1 个答案:

答案 0 :(得分:0)

似乎你只需要指定何时有一个OUTER连接,以及你在哪里进行INNER连接

select 
    D.[Date], D.MonthName, D.WeekOfYear, 
    E.bu_name, E.emp_mgr, E.emp_sup, E.emp_name, E.emp_jde, 
    C.Calls, S.sales
    from 
    DATE TABLE As D
LEFT OUTER join 
    (Select 
     cast([start_date] as date) as call_date, [agent_no], 
     sum(case when [skill_name] like '5700 Sales l%' and [Agent_Time] != '0' then 1 else 0 end) as calls
 from 
     CALL TABLE
 group by 
     cast([start_date] as date), [agent_no]) As C on D.[Date] = C.call_date
LEFT OUTER join 
    (Select 
     [AC#DTE_dt] As sale_date, [EMPJDENUM], 
     sum(case when [CH]='I' and ([IC]='L' or [IC]='H') and [ITMQTY]>3 and [EMPBUNCOD] in ('5044', '5077', '5169', '5178', '5179', '5186', '5187', '5189', '5190') then 1 else 0 end) as sales
 from 
     SALE TABLE
 group by 
     [AC#DTE_dt], [EMPJDENUM]) As S on D.Date = s.sale_date
INNER join 
EMPLOYEE TABLE As E on C.[agent_no] = E.[emp_vcc]
                    and S.[EMPJDENUM] = E.emp_jde
                    and S.sale_date between E.start_date and E.end_date
where 
D.[Date] = '11/5/2016'