2017-12-27 439 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

相关问题