2017-12-27 332 views
3

使用DSum需要花費大量的時間來計算我需要的數字。我的查詢每行大約需要0.1秒,其中有4300行。這意味着每次刷新我的數據庫時,大約需要8分鐘...訪問查詢:在不使用DSum的情況下運行總計(或另一種方法)?

我在這裏查詢的內容很深,但如果您遵循,它應該完全一致。也就是說,如果你知道如何從兩個表格和我想要的輸出中獲得A到B,請隨時幫助我。我有一個以下的工作方法,但正如我所說,它只是需要太長時間。

我從下面兩個表開始。我想要做的是從我需要的數量中減去我手邊的數量,並將任何持續的超額前滾到下一個日期。但是,我不想滾動我所需的數量。

手頭

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個月內耗盡了我手頭上的數量,並且在此之後仍然需要多達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(手動設定爲之前的任何所需的日期)。這是因爲我們可以進行聯合查詢來合併所有供應/需求數量。

手頭摘要(新查詢)

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。在這裏,我將手頭數量乘以-1,以便我們可以準備向前滾動的金額。

我也將我的數量填入Iif(IsNull()),以便我可以用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]); 

步驟4(添加DSUM,其花費的時間太長):

在這個查詢中,我拉在ProductDate,和Combined 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  

對於Roll QTY,我使用以下表達式:

輥QTY:DSUM( 「[QTY]」,「數據合併2 「[數據合併1]![Product] =''& [Product] &」'[Data Consolidation 1]![Date] < =#「& [Date] &」#「)

現在,這給了我需要的東西,但就像我說的那樣,每行大概需要0.1秒。在4300行(只是變大)中,計算時間是不可接受的。

第5步(未實現)

我不需要此部分的幫助;我知道我需要做什麼。但是我只是想包括這個,如果你想知道我將如何達到我想要的輸出。

我打算創建計算以下

最小值([組合QTY],最大值([輥QTY],0))

這些最後一個查詢是傳統maxmin功能,我明白I'll need to implement a VB module



編輯:

我重新格式化我的一些數據庫的,但我想我做到了簡單。我只設計了一個輸入表,其中「現有」數量表示爲負值。

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之前,你可以打開你想要做的事情,然後提供步驟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是該表的外部實例。對於外部實例中的每一行,我計算產品代碼相同的所有前幾天的總和。

您可以使用DSum而不是SELECT Sum([QTY Req]) FROM [Required] r WHERE r.[Date Req] < o.[Date Req] AND r.[Product] = o.[Product],但這會對性能產生負面影響。

然後,在外部查詢,這子查詢被稱爲rs,我在On Hand作爲h加入(在ħ和,我已經使用o),並使用我已經在註釋說明的邏輯。

+0

我不得不擱置一會兒,但在此期間,你能解釋速記嗎? 'rs','h','o'?一旦我有了它,當我回來時,我會告訴你它是如何工作的。 – MrMusAddict

+0

看到我目前的編輯解釋(和工作版本) –

+0

不可否認,我給的表/查詢名稱是佔位符,因爲我在標題/標題中有機密數據。也就是說,我在替換名字後才編譯它。然而,這些數字似乎沒有了,我不確定下一步要解決的問題是。 – MrMusAddict

相關問題