当连接列上有空值时,连接两个表并仅在一个表上生成结果

时间:2017-05-17 19:17:04

标签: sql sql-server sql-server-2008

我的表格配额包含“月号”,“年份”,“目标”列,如下所示

enter image description here

我有其他表格销售,其中列'id','销售日期'如下所示。

enter image description here

我将“销售日期”中的“销售日期”的月份和年份加入“配额表”中的“月份数”和“年份”以获得结果,如果我有销售额,我可以获得结果特定的月份和年份。现在可能我没有销售,所以当我加入这些列时,我没有从配额表中获得任何结果。如果Sales表中没有相应的销售,我怎么才能显示配额表值?我尝试过离开加入,但它没有显示任何结果。

3 个答案:

答案 0 :(得分:0)

就像已经说过的那样,我们不知道你想要的输出。但是,通过使用左连接,您应该从配额表中检索记录。

declare @quota table (monthnumber int, qyear int, goal int)
insert into @quota values
(2,2017,5),
(3,2017,10),
(4,2017,8),
(5,2017,8),
(6,2017,10)

declare @sales table (id int, salesdate date)
insert into @sales values
(101,'20170321'),
(102,'20170427'),
(103,'20170223'),
(105,'20170427'),
(108,'20170321'),
(109,null),
(111,null)

select q.*
from @quota as q
    left outer join @sales as s
        on year(s.salesdate) = q.qyear and 
           month(s.salesdate) = q.monthnumber

返回

monthnumber qyear   goal
--------------------------
2           2017    5
3           2017    10
3           2017    10
4           2017    8
4           2017    8
5           2017    8
6           2017    10

答案 1 :(得分:0)

您可以使用功能的月份和年份,并按以下方式进行左侧连接

select * from Quota q left join sales s
on q.year = year(s.saledate) and q.MonthNumber = month(s.saledate)

答案 2 :(得分:0)

尽管你没有说明你需要的输出或你的努力到目前为止,我还是尝试了,我想这就是你想要的:

SELECT
    Q.*,
    SalesCount = (SELECT COUNT(*) FROM Sales S
        WHERE YEAR(S."Sale Date") = Q.Year AND MONTH(S."Sale Date") = Q.MonthNumber)
FROM Quota Q

这就是结果:

MonthNumber Year       Goal       SalesCount
2           2017       5          1
3           2017       10         2
4           2017       8          2
5           2017       8          0
6           2017       10         0