【问题标题】:How do I use DCount with criteria on a Recordset?如何将 DCount 与 Recordset 上的条件一起使用?
【发布时间】:2019-08-16 16:26:04
【问题描述】:

我正在尝试构建一个查询来计算网球运动员在特定比赛记录之前参加的比赛(记录)的数量。以下是主 Matches 表的示例:

+-----------------------+------------------------+-----------------------+------------+-------------------+-----------+
|         ID1_G         |         ID2_G          |        ID_T_G         |   ID_R_G   |     RESULT_G      |  DATE_G   |
+-----------------------+------------------------+-----------------------+------------+-------------------+-----------+
| Patrick Davidson      | Darren K. Polkinghorne | Launceston Challenger | q-Second   | 4-6 7-5 7-5       | 07-Feb-15 |
| Tennys Sandgren       | David Barclay          | Launceston Challenger | q-Second   | 6-0 6-3           | 07-Feb-15 |
| Gavin Van Peperzeel   | Alexander Klintcharov  | Launceston Challenger | q-Second   | 6-1 4-6 6-1       | 07-Feb-15 |
| Yuichi Sugita         | Daniel Groom           | Launceston Challenger | q-Second   | 6-0 6-3           | 07-Feb-15 |
| Omar Jasika           | Daniel Nolan           | Launceston Challenger | q-Second   | 6-1 6-4           | 07-Feb-15 |
| Finn Tearney          | Christian Trubrig      | Launceston Challenger | q-Second   | 7-6(2) 6-0        | 07-Feb-15 |
| Alexander Sarkissian  | Issei Okamura          | Launceston Challenger | q-Second   | 6-1 6-1           | 07-Feb-15 |
| Jacob Grills          | Stefanos Tsitsipas     | Launceston Challenger | q-Second   | 6-4 1-6 6-0       | 07-Feb-15 |
| Finn Tearney          | Alexander Sarkissian   | Launceston Challenger | Qualifying | 6-4 5-7 6-4       | 08-Feb-15 |
| Yuichi Sugita         | Tennys Sandgren        | Launceston Challenger | Qualifying | 4-6 6-4 6-2       | 08-Feb-15 |
| Gavin Van Peperzeel   | Patrick Davidson       | Launceston Challenger | Qualifying | 6-3 7-6(2)        | 08-Feb-15 |
| Omar Jasika           | Jacob Grills           | Launceston Challenger | Qualifying | 6-1 7-6(6)        | 08-Feb-15 |
| Benjamin Mitchell     | Maverick Banes         | Launceston Challenger | First      | 6-4 6-2           | 09-Feb-15 |
| Mitchell Krueger      | Omar Jasika            | Launceston Challenger | First      | 6-3 4-6 6-3       | 09-Feb-15 |
| Ze Zhang              | Alex Bolt              | Launceston Challenger | First      | 6-4 6-4           | 09-Feb-15 |
| Bjorn Fratangelo      | Blake Mott             | Launceston Challenger | First      | 6-2 6-4           | 09-Feb-15 |
| Christopher O'Connell | Somdev Devvarman       | Launceston Challenger | First      | 6-2 6-1           | 09-Feb-15 |
| Brydan Klein          | Sanam Singh            | Launceston Challenger | First      | 7-6(5) 6-7(2) 6-2 | 09-Feb-15 |
| Jordan Thompson       | Yuuya Kibi             | Launceston Challenger | First      | 6-3 3-6 7-5       | 09-Feb-15 |
| Harry Bourchier       | Hiroki Moriya          | Launceston Challenger | First      | 6-1 7-6(10)       | 09-Feb-15 |
| Bradley Klahn         | Matthew Ebden          | Launceston Challenger | First      | 6-0 6-4           | 10-Feb-15 |
| Hyeon Chung           | Matt Reid              | Launceston Challenger | First      | 3-6 7-5 7-5       | 10-Feb-15 |
| Radu Albot            | Di Wu                  | Launceston Challenger | First      | 6-4 6-3           | 10-Feb-15 |
| Matthew Barton        | Kyle Edmund            | Launceston Challenger | First      | 3-6 6-3 2-0 ret.  | 10-Feb-15 |
| Dayne Kelly           | Gavin Van Peperzeel    | Launceston Challenger | First      | 6-2 3-6 6-2       | 10-Feb-15 |
| Yuichi Sugita         | Marc Polmans           | Launceston Challenger | First      | 6-4 4-6 6-3       | 10-Feb-15 |
| Jose Statham          | Finn Tearney           | Launceston Challenger | First      | 7-5 6-3           | 10-Feb-15 |
| Luke Saville          | Andrew Whittington     | Launceston Challenger | First      | 5-7 6-4 6-0       | 10-Feb-15 |
| Jordan Thompson       | Luke Saville           | Launceston Challenger | Second     | 6-4 6-4           | 11-Feb-15 |
| Harry Bourchier       | Brydan Klein           | Launceston Challenger | Second     | 2-6 7-6(5) 6-4    | 11-Feb-15 |
| Benjamin Mitchell     | Christopher O'Connell  | Launceston Challenger | Second     | 3-6 6-3 6-4       | 11-Feb-15 |
| Hyeon Chung           | Mitchell Krueger       | Launceston Challenger | Second     | 4-6 6-3 6-4       | 11-Feb-15 |
| Bradley Klahn         | Dayne Kelly            | Launceston Challenger | Second     | 5-7 6-3 6-2       | 12-Feb-15 |
| Jose Statham          | Radu Albot             | Launceston Challenger | Second     | 6-3 3-6 6-2       | 12-Feb-15 |
| Ze Zhang              | Matthew Barton         | Launceston Challenger | Second     | 6-3 6-7(5) 7-6(5) | 12-Feb-15 |
| Bjorn Fratangelo      | Yuichi Sugita          | Launceston Challenger | Second     | w/o               | 12-Feb-15 |
| Jordan Thompson       | Benjamin Mitchell      | Launceston Challenger | 1/4        | 6-2 6-3           | 13-Feb-15 |
| Hyeon Chung           | Harry Bourchier        | Launceston Challenger | 1/4        | 6-0 3-6 6-1       | 13-Feb-15 |
| Bjorn Fratangelo      | Bradley Klahn          | Launceston Challenger | 1/4        | 7-6(2) 6-3        | 13-Feb-15 |
| Ze Zhang              | Jose Statham           | Launceston Challenger | 1/4        | 6-4 6-3           | 13-Feb-15 |
| Hyeon Chung           | Jordan Thompson        | Launceston Challenger | 1/2        | 5-7 6-3 7-5       | 14-Feb-15 |
| Bjorn Fratangelo      | Ze Zhang               | Launceston Challenger | 1/2        | 6-3 ret.          | 14-Feb-15 |
| Bjorn Fratangelo      | Hyeon Chung            | Launceston Challenger | Final      | 4-6 6-2 7-5       | 15-Feb-15 |
+-----------------------+------------------------+-----------------------+------------+-------------------+-----------+

值得我指出的是,Matches 表结构不是由我决定的 - 这是我购买了许可证且无法更改的第三方应用程序。作为上下文:ID1 字段是赢家,ID2 是输家。因此,要计算ID1 的匹配数,您必须计算ID1ID2 字段中的先前记录,因为在过去它们将同时赢得和输掉比赛。反之亦然ID2 当然。

我正在寻找的输出是提取一些现有字段并添加两个“计数”字段ID1_CNTID2_CNT,如下所示:

+-----------+------------+-----------------------+-----------------------+------------------------+---------+---------+
|  DATE_G   |   ID_R_G   |        ID_T_G         |         ID1_G         |         ID2_G          | ID1_CNT | ID2_CNT |
+-----------+------------+-----------------------+-----------------------+------------------------+---------+---------+
| 07-Feb-15 | q-Second   | Launceston Challenger | Patrick Davidson      | Darren K. Polkinghorne |       8 |      14 |
| 07-Feb-15 | q-Second   | Launceston Challenger | Tennys Sandgren       | David Barclay          |     109 |       6 |
| 07-Feb-15 | q-Second   | Launceston Challenger | Gavin Van Peperzeel   | Alexander Klintcharov  |      18 |       7 |
| 07-Feb-15 | q-Second   | Launceston Challenger | Yuichi Sugita         | Daniel Groom           |     351 |       1 |
| 07-Feb-15 | q-Second   | Launceston Challenger | Omar Jasika           | Daniel Nolan           |      37 |       7 |
| 07-Feb-15 | q-Second   | Launceston Challenger | Finn Tearney          | Christian Trubrig      |       9 |       1 |
| 07-Feb-15 | q-Second   | Launceston Challenger | Alexander Sarkissian  | Issei Okamura          |       7 |       9 |
| 07-Feb-15 | q-Second   | Launceston Challenger | Jacob Grills          | Stefanos Tsitsipas     |      25 |       8 |
| 08-Feb-15 | Qualifying | Launceston Challenger | Finn Tearney          | Alexander Sarkissian   |      10 |       8 |
| 08-Feb-15 | Qualifying | Launceston Challenger | Yuichi Sugita         | Tennys Sandgren        |     352 |     110 |
| 08-Feb-15 | Qualifying | Launceston Challenger | Gavin Van Peperzeel   | Patrick Davidson       |      19 |       9 |
| 08-Feb-15 | Qualifying | Launceston Challenger | Omar Jasika           | Jacob Grills           |      38 |      26 |
| 09-Feb-15 | First      | Launceston Challenger | Bjorn Fratangelo      | Blake Mott             |      74 |      32 |
| 09-Feb-15 | First      | Launceston Challenger | Ze Zhang              | Alex Bolt              |     174 |      68 |
| 09-Feb-15 | First      | Launceston Challenger | Benjamin Mitchell     | Maverick Banes         |     129 |      30 |
| 09-Feb-15 | First      | Launceston Challenger | Jordan Thompson       | Yuuya Kibi             |      65 |      27 |
| 09-Feb-15 | First      | Launceston Challenger | Harry Bourchier       | Hiroki Moriya          |      29 |     225 |
| 09-Feb-15 | First      | Launceston Challenger | Mitchell Krueger      | Omar Jasika            |      87 |      39 |
| 09-Feb-15 | First      | Launceston Challenger | Brydan Klein          | Sanam Singh            |     194 |     102 |
| 09-Feb-15 | First      | Launceston Challenger | Christopher O'Connell | Somdev Devvarman       |      20 |     365 |
| 10-Feb-15 | First      | Launceston Challenger | Jose Statham          | Finn Tearney           |     138 |      11 |
| 10-Feb-15 | First      | Launceston Challenger | Yuichi Sugita         | Marc Polmans           |     353 |      24 |
| 10-Feb-15 | First      | Launceston Challenger | Bradley Klahn         | Matthew Ebden          |     191 |     334 |
| 10-Feb-15 | First      | Launceston Challenger | Dayne Kelly           | Gavin Van Peperzeel    |      42 |      20 |
| 10-Feb-15 | First      | Launceston Challenger | Matthew Barton        | Kyle Edmund            |      67 |     107 |
| 10-Feb-15 | First      | Launceston Challenger | Radu Albot            | Di Wu                  |     209 |     147 |
| 10-Feb-15 | First      | Launceston Challenger | Luke Saville          | Andrew Whittington     |     104 |      47 |
| 10-Feb-15 | First      | Launceston Challenger | Hyeon Chung           | Matt Reid              |      83 |     183 |
| 11-Feb-15 | Second     | Launceston Challenger | Jordan Thompson       | Luke Saville           |      66 |     105 |
| 11-Feb-15 | Second     | Launceston Challenger | Harry Bourchier       | Brydan Klein           |      30 |     195 |
| 11-Feb-15 | Second     | Launceston Challenger | Hyeon Chung           | Mitchell Krueger       |      84 |      88 |
| 11-Feb-15 | Second     | Launceston Challenger | Benjamin Mitchell     | Christopher O'Connell  |     130 |      21 |
| 12-Feb-15 | Second     | Launceston Challenger | Jose Statham          | Radu Albot             |     139 |     210 |
| 12-Feb-15 | Second     | Launceston Challenger | Bjorn Fratangelo      | Yuichi Sugita          |      75 |     354 |
| 12-Feb-15 | Second     | Launceston Challenger | Ze Zhang              | Matthew Barton         |     175 |      68 |
| 12-Feb-15 | Second     | Launceston Challenger | Bradley Klahn         | Dayne Kelly            |     192 |      43 |
| 13-Feb-15 | 1/4        | Launceston Challenger | Ze Zhang              | Jose Statham           |     176 |     140 |
| 13-Feb-15 | 1/4        | Launceston Challenger | Bjorn Fratangelo      | Bradley Klahn          |      76 |     193 |
| 13-Feb-15 | 1/4        | Launceston Challenger | Jordan Thompson       | Benjamin Mitchell      |      67 |     131 |
| 14-Feb-15 | 1/2        | Launceston Challenger | Hyeon Chung           | Jordan Thompson        |      86 |      68 |
| 14-Feb-15 | 1/2        | Launceston Challenger | Bjorn Fratangelo      | Ze Zhang               |      77 |     177 |
| 15-Feb-15 | Final      | Launceston Challenger | Bjorn Fratangelo      | Hyeon Chung            |      78 |      87 |
+-----------+------------+-----------------------+-----------------------+------------------------+---------+---------+

计数大于样本数据,因为它们计算了整个表格,但您可以看到计数如何随着玩家进行比赛而增加。

以上来自SQL如下:

SELECT games_atp.DATE_G, games_atp.ID_R_G, games_atp.ID_T_G, games_atp.ID1_G, games_atp.ID2_G, (SELECT COUNT(Dupe.ID1_G)
FROM games_atp as Dupe
WHERE Dupe.ID1_G = games_atp.ID1_G
AND Dupe.DATE_G < games_atp.DATE_G)+(SELECT COUNT(Dupe.ID2_G)
FROM games_atp as Dupe
WHERE Dupe.ID2_G = games_atp.ID1_G
AND Dupe.DATE_G < games_atp.DATE_G) AS ID1_CNT, (SELECT COUNT(Dupe.ID2_G)
FROM games_atp as Dupe
WHERE Dupe.ID2_G = games_atp.ID2_G
AND Dupe.DATE_G < games_atp.DATE_G)+(SELECT COUNT(Dupe.ID1_G)
FROM games_atp as Dupe
WHERE Dupe.ID1_G = games_atp.ID2_G
AND Dupe.DATE_G < games_atp.DATE_G) AS ID2_CNT
FROM games_atp
ORDER BY games_atp.DATE_G;

这非常慢,即使在几个小时后,Access 也没有显示任何结果的迹象。 games_atp 中有大约 280k 条记录。为了确保没有任何问题,我构建了一批记录(上面的示例数据集)来运行它,它可以工作,但需要几秒钟才能获得少量记录。所以看起来运行这种计数需要一段时间(或者结构错误?)。

在 Excel 中,我使用数组来执行大计算,因为这些显然存储在内存中,因此运行速度更快(我是这方面的新手)。我开始阅读有关 Access 中数组的更多信息,并发现了也可以存储在内存中的 Recordsets。到目前为止,我已经切换到 VBA,创建了一个 Recordset,并且我正在尝试使用 DCount 函数来计算符合条件的记录。问题是当我将记录集设置为域时,Access 似乎不喜欢它。

那么几个问题:

  1. 是否可以将 DCount 与以 Recordset 作为域的条件一起使用?
  2. 我是个白痴,我还没有找到更简单的解决方案吗?

提前致谢。

【问题讨论】:

  • 1. 的答案是明确的。不过,您可以复制和过滤记录集,然后对结果记录求和。但是,如果您提供示例数据和预期结果,我们或许可以编写更简单的查询。
  • 谢谢@Erik A。你的意思是上传文件吗?我该怎么做?
  • 不,不要上传文件。只需提供示例数据作为表格。见Share a table on Stack Overflow for easy import into MS Access
  • 编辑了原始问题。希望这是足够的信息?
  • 为什么 Players 中的名称和 Tours 中的名称与 Matches 中的名称不匹配?如果能提供相关记录就好了。

标签: ms-access


【解决方案1】:

如果您想计算每个玩家的比赛(无论输赢),则不需要两个计数字段。配对球员与比赛计数无关。

使用 UNION 查询重新排列将表数据匹配到规范化结构:

SELECT Date_G, ID_R_G, ID_T_G, ID1_G AS PlayerName, "Winner" AS Outcome FROM Matches
UNION SELECT Date_G, ID_R_G, ID_T_G, ID2_G, "Loser" FROM Matches;

然后获取当前记录日期之前的匹配计数:

SELECT *, (SELECT Count(*) FROM qryUNION 
           WHERE qryUNION.PlayerName=T1.PlayerName AND qryUNION.Date_G<T1.Date_G) AS Total 
FROM qryUNION AS T1 ORDER BY PlayerName, Date_G;

要将当前记录包括在计数中,请将

但是,在查询中运行计算可能会在大型数据集上执行得非常慢,并且基于 UNION 数据集的查询无助于提高性能。 VBA 方法可能更快。 https://www.tek-tips.com/viewthread.cfm?qid=1532770 的示例。

计算每个玩家的输赢:

TRANSFORM Count(qryUNION.Date_G) AS CountOfDate_G
SELECT qryUNION.PlayerName
FROM qryUNION
GROUP BY qryUNION.PlayerName
PIVOT qryUNION.Outcome;

返回每个玩家的总比赛数(每个玩家 1 条记录):

SELECT PlayerName, Count(*) AS CountMatches 
FROM qryUNION 
GROUP BY PlayerName;

如果你真的想在两列中显示玩家对的匹配计数(未运行):

SELECT Matches.*, Query1.CountMatches, Matches.ID2_G, Query1_1.CountMatches 
FROM Query1 AS Query1_1 
INNER JOIN (Query1 INNER JOIN Matches ON Query1.PlayerName = Matches.ID1_G) 
ON Query1_1.PlayerName = Matches.ID2_G;

【讨论】:

  • 感谢您试一试。我已经尝试过了,并且在一些记录上工作正常,但是将其增加到 560k 并且访问锁定。我敢肯定它正在后台计算计算,但这需要几天时间。我假设这是因为它必须对 560k 记录查询运行 560k 计数,而这只是需要很多时间?
  • 是的,这是在查询中运行 calc 的常见问题。尝试使用 UNION 查询作为报告的来源。使用报告排序和分组功能和文本框 RunningSum 属性。
  • 谢谢@June7。会全力以赴。
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 2011-02-22
相关资源
最近更新 更多