これは注文管理システムのシナリオです。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
私取得あなたは月のために、見ることができるように次のような結果(予想通り)
04
レコードは4つしかありません。
私が期待することは、特定の日付
ためのレコードがない場合は、月のすべての日は、右側(数量列)にゼロを左側(日付欄)に表示されていることがありますここに私が試したものです:
私はフィールドを持つテーブル[Date_Ref]
を作成しました:
日DateTime
今Date_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
は、それから私は、次の手順を使用して、月
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
テーブル
は明らかにこれは私が期待したものではありません!!。LEFT JOIN
がINNER 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
を削除しようとしました。
また、すべての結合を試しました。LEFT
RIGHT
OUTER
INNER
また、クエリ内のSalesHistory
とDate_Ref
テーブルの切り替え位置を試しました。
私は何か間違っているのですか?それとももう一つのアプローチですか?
ありがとう
長い質問には申し訳ありません!私はちょうど私が
あなたはsとSalesHistoryに参加残っていますが、麻生テーブルの上にWHERE条件を持っています。結合を離れるとき、これはnull(=このレコードのデータなし)ですが、条件を適用することで、一致していないすべての行が削除されます。これは、where条件でnull値を許可する必要があることを意味します(たとえば、s.itemmasteridがnullまたはs.itemmasterid = '001FCB08-B72E-4D1A-91D6-C3D8A8CF7008'の場合)。またはこの部分を完全に削除してください。 –