DATE字段上的JOIN左侧不在SQL

时间:2017-06-06 09:39:11

标签: sql sql-server left-join

这是订单管理系统方案。

我有一个[SalesHistory]表,其中包含以下字段:
ItemMasterID varchar(60)
数量 int
订单日期 DateTime
(省略的非相关领域)

SalesHistory执行以下查询:

select Cast(OrderDate as Date) 'OrderDate',Sum(Qty) 'Qty'  from SalesHistory 
where itemmasterid= '001FCB08-B72E-4D1A-91D6-C3D8A8CF7008' 
Group by ItemMasterId ,Cast(OrderDate as DAte)
order by OrderDate desc

我得到以下结果(正如预期的那样)
enter image description here

如您所见,04月份只有4条记录 我期望的是,如果没有该特定日期的记录,一个月的所有日子都显示在左侧(日期列),右侧为零(数量列)

以下是我的尝试:

我用字段创建了一个表[Date_Ref]
DateTime

然后我使用以下程序填写了04个月的所有日子:

declare @SD Date = convert(Date,'04/01/2017',101)
declare @ED Date = convert(Date,'04/30/2017',101)
declare @DatePeriod Date = @SD
while (@DatePeriod <= @ED)
begin
    insert into Date_Ref (Day) values (@DatePeriod)
    set @DatePeriod = DATEADD(DD, 1,@DatePeriod)
end

现在Date_Ref表填充了预期记录:

select Day 'Date' from Date_Ref

enter image description here

我尝试在此LEFT JOIN表上使用SalesHistory,希望得到上面提到的结果:

select Cast(d.Day as Date) 'Date',ISNULL (s.Qty,0) 'Qty' 
from date_Ref as d 
left join 
SalesHistory as s on Cast(s.OrderDate as date) = cast(d.Date_Period as date) 
where 
s.itemmasterid = '001FCB08-B72E-4D1A-91D6-C3D8A8CF7008'

我得到了他的结果:
enter image description here

显然这不是我所期望的。!!我有点像:

+-------------+----+
| Date        | Qty|
+-------------+----+
| 2017-04-01  |   0|
| 2017-04-02  |   0|
| 2017-04-03  |   0|
| 2017-04-04  |   0|
| 2017-04-05  |   0|
| 2017-04-06  |   0|
| 2017-04-07  |   0|
| 2017-04-08  |   0|
| 2017-04-09  |   0|
| 2017-04-10  |   1|
| 2017-04-11  |   1|
....
....

为什么LEFT JOIN表现得像INNER JOIN?或者,这是您加入DateTime字段时SQL返回的方式吗?

注意
我也尝试删除Cast 我还尝试了所有加入LEFT RIGHT OUTER INNER 我还尝试在查询中切换SalesHistoryDate_Ref表的位置。

我做错了吗?或者还有另一种方法吗?

三江源

抱歉这个冗长的问题!!我只需要描述我所做的确切步骤

2 个答案:

答案 0 :(得分:4)

where s.itemmasterid = '001FCB08-B72E-4D1A-91D6-C3D8A8CF7008'

将您的联接变为内部联接。在外连接记录中,s.itemmasterid为空,因此条件不匹配,您将关闭该行。

外连接表的条件属于ON子句。

select Cast(d.Day as Date) 'Date', ISNULL (s.Qty,0) 'Qty' 
from date_Ref as d 
left join SalesHistory as s on cast(s.OrderDate as date) = cast(d.Date_Period as date)
                            and s.itemmasterid = '001FCB08-B72E-4D1A-91D6-C3D8A8CF7008'

答案 1 :(得分:3)

条件s.itemmasterid = '001FCB08-B72E-4D1A-91D6-C3D8A8CF7008'属于left join

select Cast(d.Day as Date) 'Date',ISNULL (s.Qty,0) 'Qty' 
from date_Ref as d 
left join SalesHistory as s on 
    Cast(s.OrderDate as date) = cast(d.Date_Period as date) 
    and s.itemmasterid = '001FCB08-B72E-4D1A-91D6-C3D8A8CF7008'