如果链接表中没有匹配的值,如何显示零值

时间:2017-10-14 07:45:58

标签: sql-server database sql-server-2008 qsqlquery

根据我的下面的查询,如果在所选日期之间的“inc”表中没有数据,我怎么能得到值为“0”的最后一行。

我的查询:

select
    Calls = count(*)
  , Cust = i.Cust_id
  , Contract = c.con_id
  , Serv_Time = sum(Serv_Time)
from inc as i
  inner join contract as c
    on i.item_id = c.item_id
    and i.inc_date >= c.[start]
    and i.inc_date <= c.[end]
where c.[start]>='20160101'
group by i.Cust_id, c.con_id 
order by i.Cust_Id, c.con_id

预期产出:

+-------+---------+------------+-----------+
| Calls |  Cust   |  Contract  | Serv_Time |
+-------+---------+------------+-----------+
|     1 | Amir    | MS2016     |       300 |
|     2 | John    | HP2016     |       180 |
|     1 | Kerlee  | OR2016     |        40 |
|     1 | Nick    | CIS2016    |       120 |
|     2 | samanta | EMC2016    |       200 |
|     0 | Amir    | MS2016-New |         0 |
+-------+---------+------------+-----------+

表格结构:

create table inc
(
    inc_id int
  , cust_id varchar(16)
  , item_id varchar(16)
  , serv_time int
  , inc_date  date
);

insert into inc values
 (1,'john','HP', 40 ,'17-Apr-2015')
,(2,'John','HP', 60 ,'10-Jan-2016')
,(3,'Nick','Cisco', 120 ,'11-Jan-2016')
,(4,'samanta','EMC', 180 ,'12-Jan-2016')
,(5,'Kerlee','Oracle', 40 ,'13-Jan-2016')
,(6,'Amir','Microsoft', 300 ,'14-Jan-2016')
,(7,'John','HP', 120 ,'15-Jan-2016')
,(8,'samanta','EMC', 20 ,'16-Jan-2016')
,(9,'Kerlee','Oracle', 10 ,'02-Feb-2017');

create table contract (
    item_id varchar(16) 
  , con_id varchar(16)
  , [Start] date
  , [End] date
);
insert into contract values 
 ('Dell','DE2015','20150101','20151231')
,('HP','HP2015','20150101','20151231')
,('Cisco','CIS2016','20160101','20161231')
,('EMC','EMC2016','20160101','20161231')
,('HP','HP2016','20160101','20161231')
,('Oracle','OR2016','20160101','20161231')
,('Microsoft','MS2016','20160101','20161231')
,('Microsoft','MS2016-New','20160101','20161231')
,('Microsoft','MS2017','20170101','20171231');

1 个答案:

答案 0 :(得分:1)

使用LISTAGG和功能4000LEFT OUTER JOIN设置为零。如果你可以生成线(左外连接)

,那么获得零值就不会有问题