這是訂單管理系統方案。DATE字段中的左連接不在SQL中工作
我有一個[SalesHistory]
表具有以下字段:
ItemMasterIDvarchar(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'
顯然,這不是我所期待!!我excepected類似:
+-------------+----+
| 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
表的位置。
難道我做錯了什麼?還是有另一種方法呢?
三江源
對不起,冗長的問題!我剛剛描述的具體步驟我做什麼
你左側的接合部SalesHistory的爲S,但你ASO對錶where條件。當你離開join時,這可能是null(=這條記錄沒有數據),但通過應用這個條件,你可以消除所有不匹配的行。這意味着您需要在where條件中允許空值(例如,s.itemmasterid爲空或s.itemmasterid ='001FCB08-B72E-4D1A-91D6-C3D8A8CF7008')或完全刪除此部分 –