这是订单管理系统方案。
我有一个[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
如您所见,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
我尝试在此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'
显然这不是我所期望的。!!我有点像:
+-------------+----+
| 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
我还尝试在查询中切换SalesHistory
和Date_Ref
表的位置。
我做错了吗?或者还有另一种方法吗?
三江源
抱歉这个冗长的问题!!我只需要描述我所做的确切步骤
答案 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'