【问题标题】:Access Query: Running total without using DSum (or another approach all together)?访问查询:在不使用 DSum(或其他方法)的情况下运行总计?
【发布时间】:2017-12-29 04:43:02
【问题描述】:

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

我对这里的查询很感兴趣,但如果你跟着,它应该是完全连贯的。也就是说,如果您知道如何使用两张表和我想要的输出从 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 步:

为我的现有数量分配一个错误的日期(手动设置为在任何所需日期之前)。这样我们就可以进行联合查询以合并所有供需数量。

手头摘要(新查询)

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 步:

按产品和日期合并数量。在这里,我将现有数量乘以 -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]);

第四步(加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("[QTY]","Data Consolidation 2","[Data Consolidation 1]![Product] = '" & [Product] & "' And [Data Consolidation 1]![Date]

现在,这给了我我需要的东西,但就像我说的那样,每行大约需要 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,但不大于每月金额。

【问题讨论】:

  • 访问权限不是很好,但只是想评论这是一个很好的问题。
  • 感谢您尝试解释您的问题,但仍想要求澄清。在跳转到 SQL 之前,您能否以通俗的方式打开您想要做的事情,并提供第 1 步和第 2 步的简短示例结果?我有一种感觉,我们可以通过一两个步骤达到您想要的结果
  • @ErikvonAsmuth 在顶部添加了一些额外信息。这有帮助吗?
  • 如果我可以改写它,您想计算所需数量的运行总和,从中减去所需数量,然后有3个场景:如果运行总和减去您手头的产品,则较少大于 0,则返回 0。如果运行总和减去您手头的产品大于 0,但小于所需数量,则返回所需数量减去该等式的其余部分。如果运行总和减去您的现有产品大于所需数量,则您退回所需数量。对吗?
  • 好吧,请允许我完全不同的方式,你可能会以更快更简单的方式结束:)

标签: sql ms-access


【解决方案1】:

以下查询计算子查询中的运行总和,然后加入外部查询中手头的数量,并按照我的评论中的说明进行比较并返回结果。

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] &lt; o.[Date Req] AND r.[Product] = o.[Product],但这会对性能产生负面影响。

然后,在外部查询中,这个子查询被称为rs,我加入On Handh(在H并且,我已经使用了o)并使用我在评论中解释的逻辑。

【讨论】:

  • 我必须暂时让步,但与此同时;你能解释一下速记吗? rs, h, o?完成后,我会在我回来时告诉你它是如何工作的。
  • 查看我当前的编辑以获得解释(和工作版本)
  • 诚然,我提供的表/查询名称是占位符,因为我在标题/标题中有机密数据。也就是说,我在替换名称后对其进行了编译。但是,数字似乎不对,我不确定下一步要解决什么问题。
  • 这很奇怪。我使用您的示例数据验证了此查询。您能否提供此查询结果错误的示例数据,并解释错误的原因? (稍后再看,现在很忙)
  • 请注意,我做了一些小修改,以可能更好地反映您想要的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多