2017-06-06 7 views
0

これは注文管理システムのシナリオです。DATEフィールドのJOINがSQLで機能していません

私は以下のフィールドを持つ[SalesHistory]表があります。
        は数量int
        varchar(60)
        をItemMasterID受注日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]を作成しました:
        DateTimeDate_Refテーブルが期待レコードが書き込まれ

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 

select Day 'Date' from Date_Ref 

enter image description here


は、それから私は、次の手順を使用して、月 04のすべての日でそれを埋め

これには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) 
where 
s.itemmasterid = '001FCB08-B72E-4D1A-91D6-C3D8A8CF7008' 

を、私は彼の結果だ:私は上記の結果を得ることを期待しSalesHistoryテーブル
enter image description here


は明らかにこれは私が期待したものではありません!!。LEFT JOININNER JOINのように動作しているのはなぜ

+-------------+----+ 
| 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| 
.... 
.... 

:私のような何かをexcepected?または、DateTimeフィールドに参加したときにSQLが返す方法は?


私はまたCastを削除しようとしました。
また、すべての結合を試しました。LEFTRIGHTOUTERINNER
また、クエリ内のSalesHistoryDate_Refテーブルの切り替え位置を試しました。

私は何か間違っているのですか?それとももう一つのアプローチですか?

ありがとう

長い質問には申し訳ありません!私はちょうど私が

+1

あなたはsとSalesHistoryに参加残っていますが、麻生テーブルの上にWHERE条件を持っています。結合を離れるとき、これはnull(=このレコードのデータなし)ですが、条件を適用することで、一致していないすべての行が削除されます。これは、where条件でnull値を許可する必要があることを意味します(たとえば、s.itemmasteridがnullまたはs.itemmasterid = '001FCB08-B72E-4D1A-91D6-C3D8A8CF7008'の場合)。またはこの部分を完全に削除してください。 –

答えて

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

があなたの内部結合に参加するなり何をしたか正確な手順を記述しなければなりませんでした。外部結合レコードでは、s.itemmasteridはnullなので、条件が一致せず、行を却下します。

外部結合テーブルの条件は、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

あなたの時間のためにありがとう!! ..期待どおりに働いた –

関連する問題