在访问查询中运行总计

Posted

技术标签:

【中文标题】在访问查询中运行总计【英文标题】:Running Total in Access Query 【发布时间】:2017-06-13 23:19:56 【问题描述】:

我需要在我的访问查询中添加一个“运行总计”列。这样做的目的是确定在给定时间有多少开放地点。

有一个名为“开放日期”的字段,我想按升序计算。

在某些情况下,多个地点在同一天营业,如下所示:

╔══════════╦═══════════╦═══════════════╦
║ Location ║ Open Date ║ Running Total ║  
╠══════════╬═══════════╬═══════════════╬
║        1 ║ 1/1/1990  ║             1 ║
║        2 ║ 1/3/1990  ║             2 ║
║        5 ║ 1/3/1990  ║             3 ║
║        3 ║ 2/18/1991 ║             4 ║
║        6 ║ 3/17/1992 ║             5 ║
║        4 ║ 4/1/1995  ║             6 ║
╚══════════╩═══════════╩═══════════════╩

所以在这种情况下,我可以说在 1995 年 4 月 1 日,有 6 个开放地点。

我尝试过使用 DSum 和 DCount,但它们都没有给出我想要的结果。


更新:

这是我目前使用的代码:

SELECT t1.[store sort], t1.[soft opening],
    (SELECT COUNT(t2.[store sort]) FROM [storelist query] as  t2 
     WHERE Format(t2.[soft opening], "yyyy-mm-dd") & "-" & t2.[store sort] <= 
           Format(t1.[soft opening], "yyyy-mm-dd") & "-" & t1.[soft opening]) AS Running_Total
FROM  [storelist query] as t1
ORDER BY Format(t1.[soft opening], "yyyy-mm-dd") & "-" & t1.[store sort];

但是,这里是输出:

+------------+--------------+---------------+
| store sort | soft opening | Running_Total |
+------------+--------------+---------------+
|          1 | 8/1/1980     |             1 |
|         10 | 4/1/1985     |             2 |
|          2 | 10/1/1986    |             2 |
|          3 | 4/1/1987     |             4 |
|          4 | 10/1/1987    |             4 |
|          5 | 3/1/1988     |             5 |
+------------+--------------+---------------+

注意:这是使用数据。前面的示例只是我用于演示目的的示例数据。

如您所见,这并不是我们想要的效果。

在这种情况下,商店 2 的运行总数应为 3,因为它是第 3 家商店。商店 4 应该总共有 5 家商店。商店 5 应该有 6 家商店,等等。

【问题讨论】:

常见问题。查看support.microsoft.com/en-us/help/290136/…。搜索论坛,大概找到例子。这是一个***.com/questions/44443253/… 搜索[ms-access] running total 会返回更多结果,甚至有几个问题的标题几乎与您的一模一样:Running total query in access 错字又来了!请参阅对我的答案的评论以了解您的更新的解决方案。 【参考方案1】:

不幸的是,MS Access 没有像 Oracle 和其他公司那样内置任何非常有用的功能。这是在这些系统上使用 RANK 进行分区的完美应用。

对你来说幸运的是,我之前不得不使用这种相同的解决方法并为你提供解决方案:

SELECT t1.[Location], t1.[Open Date],
    (SELECT COUNT(t2.[Location]) FROM My_Table t2 
     WHERE Format(t2.[Open Date], "yyyy-mm-dd") & "-" & t2.[Location] <= 
           Format(t1.[Open Date], "yyyy-mm-dd") & "-" & t1.[Location]) AS Running_Total
FROM My_Table t1
ORDER BY Format(t1.[Open Date], "yyyy-mm-dd") & "-" & t1.[Location];

它看起来很难看,但我在 Access 中使用您的示例数据对其进行了测试,它可以正常工作。本质上,它针对您选择的同一个表运行内联查询,并检查有多少主键小于或等于当前记录。在这种情况下,我必须从日期和位置派生一个主键,但如果你有另一个键,你没有显示没有理由也不起作用。它必须是完全独一无二的。

【讨论】:

您好,感谢您的回复!我刚刚在我的原始帖子下添加了一个更新。你介意看看吗?代码未按预期工作。 代码的美妙之处在于它总是按照您的指示行事!仔细查看您的代码后,您有WHERE Format(t2.[soft opening], "yyyy-mm-dd") &amp; "-" &amp; t2.[store sort] &lt;= Format(t1.[soft opening], "yyyy-mm-dd") &amp; "-" &amp; t1.[soft opening]) AS Running_Total。请注意,等式的右侧有&amp; "-" &amp; t1.[soft opening]),它实际上应该是&amp; "-" &amp; t1.[store sort])。这将解决您的问题。 它工作!非常感谢!作为旁注,商店列表很长(大约 1000 家商店并且每天都在增长)。因此,该查询需要很长时间才能运行,尤其是当我将其他查询加入到这个新创建的查询中时。这是最好的方法吗?使用 VBA 会更好吗? 这是 Access 的不幸副作用,不包括 Row_Number 或 Rank 函数。因为它是内联查询,所以随着数据的增长,您的运行时间会越来越长。如果数据是完全静态的并且永远不会更改,您可能希望将其直接保存到表中自己的字段中。但是,如果您需要查看子集的运行总数,那将无法正常工作。您需要运行总计做什么?

以上是关于在访问查询中运行总计的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询重新计算运行总计

需要帮助编写查询以获取总计数和唯一计数

如何将一列的运行总计添加到 Access 查询?

SQL查询,外连接,cte?需要使用“左”值修复运行总计

Oracle SQL 分析查询 - 类似电子表格的递归运行总计

子查询或 leftjoin with group by 哪个更快?