访问查询:不使用DSum运行总计(或其他方法一起使用)?

时间:2017-12-27 19:45:17

标签: sql ms-access

使用DSum需要一个天文数量的时间来计算我需要的数字。我的查询似乎每行大约需要0.1秒,有4300行。这意味着每次刷新数据库时,大约需要8分钟......

我在这里的问题很深入,但如果你跟进,它应该是完全一致的。也就是说,如果您知道如何使用两张桌子和我想要的输出从A到B,请随时帮助我。我下面有一个工作方法,但就像我说的那样,它只需要太长时间。

我从下面的两个表开始。我想要做的是从我所需的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分配错误的日期(手动设置为在任何所需日期之前)。这样我们就可以建立联合查询来合并所有供需数量。

现有摘要(新查询)

SELECT
  DateValue("12/1/2017") AS [Date],
  [On Hand].[Product],
  [On Hand].[QTY];

第2步:

进行联盟查询,以便我们可以获得所有日期产品组合。

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,以便我们可以准备好前滚的金额。

我还将我的QTY包装在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,耗时太长):

在此查询中,我从第一个Data Consolidation查询中提取ProductDateCombined 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,我使用以下表达式:

  

滚动数量:DSum(" [数量]","数据合并2"," [数据合并1]![产品] ='& #34;& [Product]&"'和[Data Consolidation 1]![Date]< =#"& [Date]&"#&## 34)

现在,这给了我所需要的东西,但就像我说的那样每行大约需要0.1秒。在4300行(只是为了变大),这是一个不可接受的计算时间。

步骤5(未实施)

我不需要这部分的帮助;我知道我需要做什么。但是如果你想知道我将如何得到我想要的输出,我只想包括这个。

我计划创建一个计算以下

的最后一个查询
  

最小值([合并数量],最大值([滚动数量],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 个答案:

答案 0 :(得分: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(在 H 上,我已使用o)并使用我在评论中解释的逻辑。