【发布时间】: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 查询中提取 Product、Date 和 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,我使用这个表达式:
滚动数量:DSum("[QTY]","Data Consolidation 2","[Data Consolidation 1]![Product] = '" & [Product] & "' And [Data Consolidation 1]![Date]
现在,这给了我我需要的东西,但就像我说的那样,每行大约需要 0.1 秒。跨越 4300 行(只是为了变得更大),这是一个不可接受的计算时间。
第 5 步(未实现)
这部分我不需要帮助;我知道我需要做什么。但如果你想知道我将如何获得我想要的输出,我只是想包括这个。
我计划创建一个计算以下结果的最后一个查询
最小([组合数量],最大([滚动数量],0))
这些是传统的max 和min 函数,我理解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,但小于所需数量,则返回所需数量减去该等式的其余部分。如果运行总和减去您的现有产品大于所需数量,则您退回所需数量。对吗?
-
好吧,请允许我完全不同的方式,你可能会以更快更简单的方式结束:)