2017-06-13 74 views
1

我需要在我的Access查询中添加“Running Total”列。这样做的目的是确定在特定时间有多少个开放位置。在Access查询中运行总计

有一个名为“开放日期”的字段,我希望按升序排列。

在某些情况下,多个位置打开的同一天,如下图所示:

╔══════════╦═══════════╦═══════════════╦ 
║ 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,但这些都没有给出我想要的结果。


UPDATE:

这是我目前使用的代码:

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个商店,等等。

+1

常见问题。查看https://support.microsoft.com/zh-CN/help/290136/how-to-create-a-running-totals-query-in-microsoft-access。搜索论坛,可能会找到例子。这里是一个https://stackoverflow.com/questions/44443253/loop-through-records-and-increment-value-in-vba-access/44444821#44444821 – June7

+0

搜索'[ms-access]运行total'返回甚至更多的结果,甚至几个题目几乎完全像你的问题:[在访问中运行总查询](https://stackoverflow.com/questions/38936340/running-total-query-in-access) –

+0

Typo再次罢工!请参阅关于我的答案的评论以了解更新的解决方案。 – SandPiper

回答

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]; 

它看起来很丑,可是我跟你的样本数据,并测试它的访问作品。本质上,它针对您选择的同一张表运行内嵌查询,并检查有多少个主键小于或等于当前记录。在这种情况下,我不得不从日期和地点派生一个主键,但是如果你有另一个你没有显示的键,没有理由不会工作。它必须是完全独特的。

+0

嗨,感谢您的回应!我刚刚在原始帖子中添加了更新。你介意看看它吗?代码没有按预期工作。 – Darren

+1

关于代码的美妙之处在于,它总是确切地告诉你它!在仔细查看代码后,可以看到'WHERE Format(t2。[soft opening],“yyyy-mm-dd”)&“ - ”&t2。[存储分类] <= 格式(t1。[软打开],“yyyy-mm-dd”)&“ - ”&t1。[软打开])AS Running_Total'。请注意,该等式的右边有'&“ - ”&t1。[soft opening])',它实际上应该是'&“ - ”&t1。[store sort])''。这将解决您的问题。 – SandPiper

+0

它的工作原理!非常感谢!作为一个旁注,商店的名单是相当长的(约1000家商店和日益增长)。因此,这个查询需要很长时间才能运行,特别是当我将这个新创建的查询加入其他查询时。这是最好的方式去做呢?使用VBA会更好吗? – Darren