2017-06-06 65 views
0

這是訂單管理系統方案。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 

我得到下面的結果(如預期)
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 JOINSalesHistory表期望得到我上面提到的結果:

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


顯然,這不是我所期待!!我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
我也試過所有的連接LEFTRIGHTOUTERINNER
我也嘗試在查詢中切換SalesHistoryDate_Ref表的位置。

難道我做錯了什麼?還是有另一種方法呢?

三江源

對不起,冗長的問題!我剛剛描述的具體步驟我做什麼

+1

你左側的接合部SalesHistory的爲S,但你ASO對錶where條件。當你離開join時,這可能是null(=這條記錄沒有數據),但通過應用這個條件,你可以消除所有不匹配的行。這意味着您需要在where條件中允許空值(例如,s.itemmasterid爲空或s.itemmasterid ='001FCB08-B72E-4D1A-91D6-C3D8A8CF7008')或完全刪除此部分 –

回答

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' 
+0

這非常完美!謝謝你的時間 –

3

條件s.itemmasterid = '001FCB08-B72E-4D1A-91D6-C3D8A8CF7008' shoult屬於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' 
+0

謝謝你的時間!! ..完全按照預期工作 –