2016-04-05 6 views
2

私は自分の仕事にMSアクセスを使用しており、自分自身を解決するには時間がかかっていた問題があるので、私はあなたに頼むことにしました。質問は次である: 私は価格のための2つのテーブルを持っている:a_pricesデータベース価格表集計の問題

article5 a_price from_date to_date 
00009  952.00 01/01/2012 31/12/2013 
00009  720.00 01/01/2014 31/12/2015 
00009  750.00 01/01/2016 31/12/2199 

とa_client_prices

client_id article5 a_price from_date to_date 
1   00009  700  31/12/2014 11/09/2015 
2   00009  800  05/10/2015 07/04/2016 

問題が入力ので、もし、正確なクライアントのために価格のテーブルを返すクエリを作成することです

article5 a_price from_date to_date 
00009  952.00 01/01/2012 31/12/2013 
00009  720.00 01/01/2014 30/12/2014 
00009  700  31/12/2014 11/09/2015 
00009  720.00 12/09/2014 31/12/2015 
00009  750.00 01/01/2016 31/12/2199 

そして= 2 CLIENT_IDの場合:

"どこのclient_id = 1" 結果のテーブルは、次のようになりました、そのクエリの
article5 a_price from_date to_date 
00009  952.00 01/01/2012 31/12/2013 
00009  720.00 01/01/2014 04/10/2015 
00009  800  05/10/2015 07/04/2016 
00009  750.00 08/04/2016 31/12/2199 

だから、クエリ内a_client_pricesが高い優先順位を持ってオーバーラップを除くメカニズム、のようなものがあるはずですが、私は、集約、その後、毎日のレコードが含まれているテーブルを結合するよりも良い事を想像して、過剰なレコードを除外することができず、それは期間に戻ります。

私はmsアクセスを使用しているので、私は簡単にカスタム集約関数を使用することができます。私はそれが解決策の一つかもしれないと感じていますが、自分自身を設計する方法を理解するには、その分野での経験が乏しいです。事前にあなたの助けをありがとう、申し訳ありません私はその前に投稿された答えを逃した場合。最初のデータ編成を自由に判断し、他の可能性を提案してください。

P.S.日々の集計を行うソリューションは完全に機能していますが、処理時間がかかり過ぎてクエリがあまりにも多く使われるため、このソリューションは拒否されました。

+0

これらの価格の使い方によっては、可能な日付ごとに価格設定を完全に表示する必要はありません。 VBAを使用して、対応する 'a_price'を返すカスタムルックアップ関数、たとえば' LookupPrice(client_ID、article5、effective_date) 'を作成することができます。 –

+0

a_client_pricesが発生する前に、テーブルa_priceを使用して他のデータテーブルとのクエリに参加させました。私にとって明白な解決策は、サブクエリと同じインターフェイスを作り直して代わりに使用することでしたが、時間と私はまだ大規模なその遅さのためにクエリとルックアップ機能の実装の不可能性のために一時テーブルとVBAを避けたい。私がテストしている最後のアイデアは、両方のテーブルを結合し、必要な順序で値を取ることです(レコードがa_client_pricesでnullでない場合はa_priceを取り、それ以外の場合はa_pricesからレコードを取ります)。 – tamat

+0

両方のテーブルを結合することで解決策について悪いことは、今私は新しい結合を含むためにほぼ20のクエリを書き直さなければならないということです。しかし、私はこのスレッドで何度も叫んだので、簡単に解決できるソリューションがないと思われます。あなたのアドバイスをお寄せいただきありがとうございます。私が多くのことを気に入らなくてもこのオプションを忘れてしまったからです。 – tamat

答えて

1

これはクエリでは実行できません。

あなたはこのソースレコードを取っている:

00009  720.00 01/01/2014 31/12/2015 

をし、二つのレコードにそれを分割、その場で日付フィールドを変更:

00009  720.00 01/01/2014 30/12/2014 
00009  720.00 12/09/2014 31/12/2015 

そして、これはただ一つ、いくつかの異なる例であります。

集計関数はこれを行いません。 VBAソリューションが必要で、レコードセットを歩き回り、新しいテーブルにターゲットレコードを作成する必要があります。

編集

1つのクライアントの価格リストを計算するための私のアプローチは、次のようになります。

  • 各レコードのために一時テーブル
  • に一時テーブルa_pricesから
  • 挿入*から*削除:
    • それは1つの日付の範囲に「収まる」とします。それは2つの日付範囲と重なる場合は適応させる、それを複製from- &に、日付
    • :新しい日付範囲
    に除外するように両方のレコードを適応させます
一時テーブルに a_client_pricesレコードを挿入

かなりのロジックが必要ですが、本当に速くなければなりません。

+0

私は質問をしたのは、毎日レコードを分割して集計して戻ってくるような解決方法を知っているからです。処理時間が速いわけではありませんが、実行できます。おそらく、あなたはこの種のクエリーをより簡単に行うことができるように、データ編成の別の方法をアドバイスできますか? – tamat

+0

日ごとに分割する必要はありません。編集を参照してください。 – Andre

+0

Hm ...おそらくそれは解決策になるかもしれませんが、価格はクライアント側でかなり頻繁に使用され、変更されています。表a_pricesは膨大であり、サマリー表を再作成するプロセスは、それが私が一時テーブルを避けてサブクエリにパックしようとした理由です。私が必要とするクエリに簡単に加わることができます。 – tamat