DSumを使用すると、必要な数を計算するために天文学的な時間がかかります。私のクエリでは、1行につき約0.1秒かかりますが、4300行あります。これは、私のDBをリフレッシュするたびに、約8分かかります...アクセスクエリ:DSumを使用しないで稼働している合計(または別のアプローチをまとめて)?
私はここでクエリの深いネックですが、あなたがそれに従うなら、それは完全に一貫している必要があります。それは、あなたが2つのテーブルと私の希望する出力でAからBに到達する方法を知っているなら、私を助けてください。私は以下の作業方法を持っていますが、私が言ったように、それはあまりにも長くかかるだけです。
以下の2つの表から始めます。私がやりたいことは、必要なQTYから手元のQTYを差し引き、引き続き超過分を次の日にロールフォワードすることです。しかし、私は必要なQTYをロールフォワードしたくありません。
手で
Product | QTY
A | 125
必要(この例では、私は月額50が必要)
Product | QTY Req | Date Req
A | 50 | 1-1-18
A | 50 | 2-1-18
A | 50 | 3-1-18
A | 50 | 4-1-18
A | 50 | 5-1-18
A | 50 | 6-1-18
そして、これは私の所望の出力です:(この例では、私は3ヶ月以上でQTYを手にしていますが、それ以降は50ヶ月も必要です。
Product | Build QTY | Date Req
A | 0 | 1-1-18
A | 0 | 2-1-18
A | 25 | 3-1-18
A | 50 | 4-1-18
A | 50 | 5-1-18
A | 50 | 6-1-18
ステップ1:
(手動で必要な日数前に設定)私の手QTYに誤った日付を割り当てます。これは、すべての需要と供給のQTYを統合するためのユニオンクエリーを作成できるようにするためです。ハンド概要
(新しいクエリ)
SELECT
DateValue("12/1/2017") AS [Date],
[On Hand].[Product],
[On Hand].[QTY];
ステップ2:
ので、我々はすべてのdate↔productコンボを取得することができますユニオンクエリを作成します。
uQuery(新しいクエリ)
SELECT
[On Hand Summary].[Date] AS [Date],
[On Hand Summary].[Product] AS [Product]
FROM [On Hand Summary]
UNION SELECT
[Required].[Date Req] AS [Date],
[Required].[Product] AS [Product]
FROM [Required];
ステップ3:
製品&日付でQTYを統合。ここでは、手持ちのQTYに-1を掛けて、ロールフォワードする金額を準備することができます。
Iif(IsNull())
にQTYsをラップするので、null値を0に置き換えることができます。
データ統合1(新しいクエリ)
SELECT
[uQuery].Date,
[uQuery].Product,
IIf(IsNull(-1*[On Hand Summary]![QTY]),0,-1*[OH Summary]![QTY]) AS [OH QTY],
IIf(IsNull([Required]![QTY Req]),0,[Required]![QTY Req]) AS [Req QTY],
[OH QTY]+[Req QTY] AS [Combined QTY]
FROM ([uQuery]
LEFT JOIN [On Hand Summary] ON
([uQuery].Product = [On Hand Summary].Product) AND
([uQuery].Date = [On Hand Summary].Date))
LEFT JOIN Forecast ON
([uQuery].Product = Required.Product) AND
([uQuery].Date = Required.[Date Req]);
(時間がかかりすぎるDSUMを、追加する)ステップ4:
このクエリでは、私はDate
、Product
に引き、そしてCombined QTY
から最初のデータ連結クエリ、Roll QTY
列を追加します。 Roll QTY
については
データ統合2(新しいクエリ)
Product | Date | Combined QTY | Roll QTY
A | 12-1-17 | -125 | -125
A | 1-1-18 | 50 | -75
A | 2-1-18 | 50 | -25
A | 3-1-18 | 50 | 25
A | 4-1-18 | 50 | 75
A | 5-1-18 | 50 | 125
A | 6-1-18 | 50 | 175
、私はこの表現を使用します。
ロールQTY:DSUM( "[QTY]"、「データ統合2を"[データ集約1]![製品] = '" & [製品] & "' [データ集約1]![日付] < =#" & [日付] & "#")
さて、これは私が必要なものを私に与えますが、私が言ったように、それは、行ごとにおよそ0.1秒かかります。 4300行にわたって(より大きくなるために)、それは計算には許容できないほどの時間です。 (未実装)
ステップ5
私はこの部分で助けを必要としません。私は何をする必要があるか分かっています。しかし、私が望む出力にどのように到達するかを知りたければ、これを含めるだけでした。
は、私は伝統的な次
最小([複合QTY]、最大([ロールQTY]、0))
これらを算出した最後のクエリを作成することを計画max
とmin
関数、私は理解してI'll need to implement a VB module。
EDIT:
私はDBの一部を再フォーマットが、私はそれが簡単になると思います。私は、手元の量が負の値で表されるただ1つの入力テーブルを作成することができました。
Product | QTY Req | Date Req
A | -125 | 12-1-18
A | 50 | 1-1-18
A | 50 | 2-1-18
A | 50 | 3-1-18
A | 50 | 4-1-18
A | 50 | 5-1-18
A | 50 | 6-1-18
これをDSUMを使用せずにロールバックする方法はありますか?確認するには
は、最終的な値は0未満のではなく、毎月の量よりも多くてはなりません。
アクセス権はあまり良くありませんが、これは大きな疑問です。 –
あなたの質問を説明しようとしていることに感謝しますが、依然として明確化を求めています。あなたは、SQLにジャンプする前に、あなたはlaymansの言葉で何をしたいかで開き、ステップ1と2の短い例の結果を提供できますか?私はあなたが1つまたは2つのステップであなたの望む結果を達成することができると感じています –
@ErikvonAsmuthトップにいくつかの追加情報を追加しました。それは役に立ちますか? – MrMusAddict