运行 访问查询总数
Running Total in Access Query
我需要在我的访问查询中添加一个 "Running Total" 列。这样做的目的是确定在给定时间有多少个空位。
有一个名为 "Open Date" 的字段,我想按升序排列。
在某些情况下,多个地点在同一天营业,如下所示:
╔══════════╦═══════════╦═══════════════╦
║ 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,因为它是第三家商店。商店 4 应该有 运行 总共 5 家商店。商店 5 应该有 运行 总共 6 家商店,等等
不幸的是,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 中使用您的示例数据对其进行了测试并且它有效。本质上,它针对您选择的相同 table 运行内联查询,并检查有多少主键小于或等于当前记录。在这种情况下,我必须从日期和位置派生出一个主键,但如果您有另一个没有显示的键,那也没有理由不起作用。它必须是完全独一无二的。
我需要在我的访问查询中添加一个 "Running Total" 列。这样做的目的是确定在给定时间有多少个空位。
有一个名为 "Open Date" 的字段,我想按升序排列。
在某些情况下,多个地点在同一天营业,如下所示:
╔══════════╦═══════════╦═══════════════╦
║ 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,因为它是第三家商店。商店 4 应该有 运行 总共 5 家商店。商店 5 应该有 运行 总共 6 家商店,等等
不幸的是,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 中使用您的示例数据对其进行了测试并且它有效。本质上,它针对您选择的相同 table 运行内联查询,并检查有多少主键小于或等于当前记录。在这种情况下,我必须从日期和位置派生出一个主键,但如果您有另一个没有显示的键,那也没有理由不起作用。它必须是完全独一无二的。