2016-07-01 20 views
0

タイトルが非常によく記述されているかどうかはわかりませんが、私の問題は基本的に、日付だけでなく他のテーブルに別のテーブルを結合しようとしていることですその日にその製品に割り当てられた価格を持ち込むことができるようにIDフィールドを設定します。 1つのテーブルは販売履歴用であり、もう1つは当社が保有するすべての製品のリストで、その日の更新価格です。価格表は単純に3列です。 ProdID、日付、価格。毎日新しい価格セットが生成されると、新しい日数データが​​価格表の下に追加されるため、ProdIDは毎日何回も複製されます。結合が成功するまで日付フィールドに1日追加する

当社の販売履歴テーブルには、当日販売された製品の価格が格納されていないため、価格表の値を毎日の価格の全リストとともにPRODIDと日付にしています。

は、これまでのところ、かなりまっすぐ前方に、これまで...

私の問題は、その日の更新価格表はだけなので、作業日に発生したという事実から来て 週末に行われた販売に参加できる日付と価格がない週2日が残っているため、価格列に空白が残っています。

これを回避するには、結合の論理が「次の利用可能な価格」をもたらすことが必要です。例えば。土曜日や日曜日に売却が行われた場合は、月曜日に作成された価格を引っ張りたい。これには、参加を実行できるまで日にちを追加する何らかの種類の声明が含まれますか?

私はMS Accessでこれをすべて実行しています。

価格表:Salesテーブルの

+---------+-------+------------+----------+ | ProdID | Price | Date | Weekday | +---------+-------+------------+----------+ | 9999999 | £50 | 07/06/2016 | Thursday | | 9999999 | £50 | 08/06/2016 | Friday | | 9999999 | £45 | 11/06/2016 | Monday | | 9999991 | £100 | 07/06/2016 | Thursday | | 9999991 | £100 | 08/06/2016 | Friday | | 9999991 | £95 | 11/06/2016 | Monday | +---------+-------+------------+----------+

期待される成果:

+---------+------------+------------+----------+--+ | ProdID | Sell Price | Date | Weekday | | +---------+------------+------------+----------+--+ | 9999999 | £50 | 08/06/2016 | Friday | | | 9999999 | £45 | 09/06/2016 | Saturday | | | 9999999 | £45 | 10/06/2016 | Sunday | | | 9999999 | £45 | 10/06/2016 | Sunday | | | 9999991 | £100 | 08/06/2016 | Friday | | | 9999991 | £100 | 08/06/2016 | Friday | | | 9999991 | £95 | 10/06/2016 | Sunday | | +---------+------------+------------+----------+--+

感謝します。

+1

入力テーブルと期待される結果のいくつかのサンプルデータを追加してください。 http://ozh.github.io/ascii-tables/ – Andre

+0

を使用していくつかのテーブルを追加しました。最初の表に見られるように、新しい価格は作業日ごとに生成され(IDでソートされています)、変更なしで最後の価格の繰り返しであることがよくあります。翌営業日に生成された価格を使用するには、売上表が必要です。例えば。 ID 9999999の販売が6月9日〜10日(週末)に行われた場合、月曜日に作成された価格がピックアップされます – thatguy

答えて

2

私の解決策は、結合ではなくサブ選択で機能します。

私は次のようにあなたがSALES_HISTORYテーブルを持っていることを前提としています。販売履歴テーブルのすべての列

SALES_HISTORY 
+---------+-------------+----------+ 
| ProdID |  Date | Weekday | 
+---------+-------------+----------+ 
| 9999999 | 07/06/2016 | Thursday | 
| 9999999 | 08/06/2016 | Thursday | 
| ...  | ...  | ...  | 
+---------+-------------+----------+ 

最初に選択し、以下のSQL文と、その後の販売日にかで製品の価格を選択販売日以降の最初の使用可能日。

SELECT ProdID, 
     Date, 
     Weekday, 
     (SELECT Price 
     FROM PRICE_TABLE P 
     WHERE P.ProdID = S.ProdID 
     AND P.Date = (SELECT MIN(P2.Date) 
         FROM PRICE_TABLE P2 
         WHERE P2.ProdId = P.ProdID 
         AND P2.Date >= S.Date)) 
FROM SALES_HISTORY S; 

(SQL文がエディタに入力されたため、テストされたことに注意してください。)

+0

はい、上記のように私の売上表は多かれ少なかれフォーマットされています。それにはいくつかの列がありますが、私は現時点では必須のものだけを含んでいます。平日の欄は参考のためのもので、オリジナルのものではありません。 このクエリをコードで実行するように設定しました。これで、Accessは現在作業中です。このようなクエリを実行するにはどれくらいの時間がかかるでしょうか?価格表には100万行弱、販売用には100万行ほどあります。 – thatguy

+1

私は期間の合理的な見積もりを与えることはできません。それでも、クエリの複雑さとテーブル内の行数を考慮すると、クエリは数秒ではないと推測されます。この場合、価格表に不足している日付を追加することにします。 –

+0

これは迅速ではありませんが、コードが実際に動作するように見えます。ご協力いただきありがとうございます!私はそれが実行するのにずっと時間がかかる理由は、各IDのためにリストを何度も実行しなければならないと考えています。テーブルをインデックス化して速度を向上させることは可能でしょうか?私はインデックス作成を実際にやっていませんでしたので、そのプロセスについて少し不明です。再度、感謝します! – thatguy

関連する問題