2017-12-27 10 views
3

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:

このクエリでは、私はDateProductに引き、そして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))

これらを算出した最後のクエリを作成することを計画maxmin関数、私は理解して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未満のではなく、毎月の量よりも多くてはなりません。

+1

アクセス権はあまり良くありませんが、これは大きな疑問です。 –

+1

あなたの質問を説明しようとしていることに感謝しますが、依然として明確化を求めています。あなたは、SQLにジャンプする前に、あなたはlaymansの言葉で何をしたいかで開き、ステップ1と2の短い例の結果を提供できますか?私はあなたが1つまたは2つのステップであなたの望む結果を達成することができると感じています –

+0

@ErikvonAsmuthトップにいくつかの追加情報を追加しました。それは役に立ちますか? – MrMusAddict

答えて

2

次のクエリは、その後、サブクエリで実行中の合計を計算し、外側のクエリで手持ちの数量に参加して、比較を行い、私のコメントで説明したように結果を返します。

SELECT 
    rs.Product, 
    SWITCH( 
     RunningSum - h.[QTY] < 0, 0, 
     RunningSum - h.[QTY] < rs.[QTY Req], rs.[QTY Req] - (RunningSum - h.[QTY]), 
     TRUE, rs.[QTY Req] 
    ) AS [Build QTY], 
    rs.[Date Req], RunningSum 
FROM 
    (SELECT 
    (
     SELECT Sum(r.[QTY Req]) 
     FROM [Required] r 
     WHERE r.[Date Req] <= o.[Date Req] 
     AND r.[Product] = o.[Product] 
     AND r.[QTY req] > 0 
    ) AS RunningSum, 
    o.Product, 
    o.[QTY Req], 
    o.[Date Req] 
    FROM [Required] o 
    WHERE o.[QTY req] > 0) rs 
LEFT JOIN (SELECT oh.[QTY req]*-1 As QTY, Product FROM [Required] oh WHERE oh.[QTY req] < 0) h ON h.[Product] = rs.[Product] 


説明:

ランニング合計は次のクエリで計算サブクエリ:

SELECT Sum([QTY Req]) 
FROM [Required] r 
WHERE r.[Date Req] <= o.[Date Req] 
AND r.[Product] = o.[Product] 
AND r.[QTY req] > 0 

roは、このクエリで別名です。 rrequiredテーブルの最も内側のインスタンスです。 rは、そのテーブルの外部インスタンスです。外部インスタンスの各行について、商品コードが同じ前日のすべての合計を計算しています。

SELECT Sum([QTY Req]) FROM [Required] r WHERE r.[Date Req] < o.[Date Req] AND r.[Product] = o.[Product]の代わりにDSumを使用できますが、パフォーマンスに悪影響があります。

その後、外側のクエリでは、このサブクエリはrsと呼ばれ、私はhとしてOn Handに参加(Hにと、私はすでにoを使用)、私はコメントで説明してきたロジックを使用しています。

+0

私はしばらくの間待たなければなりませんが、あなたは省略形を説明できますか? 'rs'、' h'、 'o'?一度私がそれを持っていると、私はあなたが戻ったときにそれがどのように動作するかを知らせます。 – MrMusAddict

+0

私の現在の編集内容を参照してください(そして現在のバージョン) –

+0

タイトル/ヘッダーに機密データがあるので、私が与えたテーブル/クエリ名はプレースホルダでした。つまり、名前を置き換えてコンパイルすることにしました。しかし、その数字は見えなくなってしまい、次のトラブルシューティングの手順はわかりません。 – MrMusAddict

関連する問題