我需要在Access Query中添加“Running Total”列。这样做的目的是确定在给定时间有多少个开放位置。
我希望在升序中计算一个名为“开放日期”的字段。
在某些情况下,多个位置会在同一天打开,如下所示:
╔══════════╦═══════════╦═══════════════╦
║ 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 |
+------------+--------------+---------------+
注意:这是使用数据。前面的例子只是我用于演示目的的样本数据。
正如您所看到的,这不是预期的效果。
在这种情况下,Store 2的总运行总数应为3,因为它是第3个商店。商店4应该总共有5家商店。并且商店5应该总共有6家商店等。
答案 0 :(得分: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中使用您的示例数据对其进行了测试,并且它可以正常运行。实质上,它针对您选择的同一个表运行内联查询,并检查有多少主键小于或等于当前记录。在这种情况下,我必须从日期和位置派生一个主键,但如果你有另一个键,你没有显示,没有理由不会起作用。它必须是完全独特的。