2017-01-25 9 views
0

私は今、少し時間のための解決策を探していましたが、これに関するいくつかの他のテーマを見ましたが、私は問題を解決できませんでした。アクセスクエリ - 日付範囲を個々の日付に変換する

私が持っているテーブル、特定の日付範囲の値が含まれている「データ」:私は私の個々の日付でカレンダーを作成している

| CalendarDate | Volume 
| 01/01/2017 | 2 
| 02/01/2017 | 2 
| 03/01/2017 | 2 
| 04/01/2017 | 0 

:私は以下の結果を得たい

|Arrival Date | Departure Date | Volume 
| 01/01/2017 | 04/01/2017  | 6 

これは私の質問で使用しています。 、それを今

SELECT 
    Dates.CalendarDate, 
    Sum([Volume]/DateDiff("d",[Arr Date],[Dep Date])) AS Vol, 
    Data.[Arr Date], 
    Data.[Dep Date] 
FROM Dates 
LEFT JOIN Data 
    ON (Dates.CalendarDate = Data.[Arr Date]) 
    AND (Dates.CalendarDate = Data.[Dep Date]) 
GROUP BY 
    Dates.CalendarDate, 
    Data.[Arr Date], 
    Data.[Dep Date] 
HAVING 
    (((Dates.CalendarDate)>=[Data].[Arr Date] 
    And (Dates.CalendarDate)<[Data].[Dep Date])); 

私は以下のSQLで直接変更した場合:私は、私は、ウェブ上で見つけたものを使用しようとすると、以下のクエリを行っているが、このクエリの結果は常に空です動作します。私の唯一の問題は、デザインモードに戻ろうとすると、このコードをデザインモードに代わって接続を解除できないということです。しかし、SQLについて何も知らなくても、一部のユーザーがクエリを修正できるようにするために、これをデザインモードで実行する必要があります。

SELECT 
    Dates.CalendarDate, 
    Sum([Volume]/DateDiff("d",[Arr Date],[Dep Date])) AS SommeDeNuitées, 
    Data.[Arr Date], 
    Data.[Dep Date] 
FROM Dates 
LEFT JOIN Data 
    ON (Dates.CalendarDate < Data.[Dep Date]) 
    AND (Dates.CalendarDate >= Data.[Arr Date]) 
GROUP BY 
    Dates.CalendarDate, 
    Data.[Arr Date], 
    Data.[Dep Date]; 

ありがとうございます!

+0

左はサインインし、「等しい」以外の何かに参加しますか?以前はそれを見たことがありませんでした...私はあなたがこれを実際のフィールドに引っ張り出して引っ張りたいと思うと思います。今のところ、すべての数式を取り出して、彼らは画像を混乱させる。最初に正しいデータを返すようにクエリを取得し、次にそれを使って何を行うのか心配してください。また、私はあなたがどのようにデータを外挿するのか不明です。 2014年1月1日に2のボリュームがあることをどのように知っていますか? –

+0

あなたのクエリとGustavの回答のいずれも、各カレンダーの日付ごとに1つのレコードを作成しません。たとえば、到着と出発の日付が重複していない2つの 'Data'レコードがある場合、それらのレコードを集計するのではなく、2つのレコードごとに別々のカレンダー日付レコードが作成されます。これがあなたが望むものだと確信していますか? – SunKnight0

+0

@JohnnyBones - 私は特定の日付が2のボリュームを持っているかどうかはわかりませんが、私の目的のために、このデータをすべての日付に均等に広げるのに十分です。左への参加に関して、私はカレンダーからすべてのレコードを確実に取得したかっただけです。ある夜に音量がなくても、私はそれを持っている必要があります。 – PHil

答えて

0

「参加」を試してみてください:

SELECT 
    Dates.CalendarDate, 
    Sum([Volume]/DateDiff("d",[Arr Date],[Dep Date])) AS SommeDeNuitées, 
    Data.[Arr Date], 
    Data.[Dep Date] 
FROM Dates 
WHERE 
    Dates.CalendarDate < Data.[Dep Date] 
    AND 
    Dates.CalendarDate >= Data.[Arr Date] 
GROUP BY 
    Dates.CalendarDate, 
    Data.[Arr Date], 
    Data.[Dep Date]; 
+0

結合を指定しないと、デフォルトでデカルトを作成しませんか? –

+0

パーサが賢明かもしれません。それに加えて、他にどんな選択肢がありますか?もちろん、ユーザーのSQLを教えるために。 – Gustav

+0

@Gustavあなたの答えをありがとう。しかし、SunKnightsが指摘しているように(実際にはうまくいきますが)、特定の日付のすべてのボリュームの合計ではなく、別の日付範囲が重複していると、重複した日付が取得されるようになります。 – PHil