在没有重新查询的情况下访问另一个表中的查询计数记录?

Posted

技术标签:

【中文标题】在没有重新查询的情况下访问另一个表中的查询计数记录?【英文标题】:Access Query Count Records in Another Table without Requery? 【发布时间】:2018-08-22 15:08:46 【问题描述】:

我正在尝试制作一份报告,我需要知道像这样的另一个表中的项目数

+----------+--------+--------------------------------------------+
| Sale No. | Widget |                 Total Sold                 |
+----------+--------+--------------------------------------------+
|      123 | foo    | Dcount(another table where widget = "foo") |
|      456 | bar    | Dcount(another table where widget = "bar") |
+----------+--------+--------------------------------------------+

SELECT  [Sale No.]
        , Widget
        , Dcount("SELECT foo from whatever where widget = " & widget) as [Total Sold]
FROM    sometable

不幸的是,这会查询数据库中的每条记录,对于这样一个必须每天运行的报告来说,这并不是很有效。

有没有办法查询一次,通过 VBA 或一些我不知道的 SQL 将查询保存在内存中或每个唯一项目的计数。基本上只查询另一张表一次而不是N次。


这是一个更准确的表格,可以更准确地反映我的数据

+----------+------------+---------+------------------+
| Employee | Department | Policy  | Review Requested |
+----------+------------+---------+------------------+
|      123 | Sales      | PlanABC | TRUE             |
|      456 | Sales      | PlanABC | TRUE             |
|      789 | Accounting | PlanXYZ | FALSE            |
|   101112 | Accounting | PlanXYZ | TRUE             |
|   131415 | Sales      | PlanXYZ | FALSE            |
|   161718 | Admin      | PlanJKL | TRUE             |
+----------+------------+---------+------------------+

我想要的结果

+------------+----------+---------+----------------------+
| Department | Employee | Policy  | Count of All Polices |
+------------+----------+---------+----------------------+
| Sales      |      123 | PlanABC |                    2 |
| Sales      |      456 | PlanABC |                    2 |
| Accounting |   101112 | PlanXYZ |                    3 |
| Admin      |   161718 | PlanJKL |                    1 |
+------------+----------+---------+----------------------+

【问题讨论】:

您可以加入您的表并使用 SQL Count 而不是 Access DCOUNT。您的原始表格是如何设置的? [Sale No.] 在表中是唯一的吗? 据我所知,没有真正的逻辑连接。它实际上是同一张表,查询是获取所有记录,其中 status="foo" 计算具有相同小部件的所有记录,而不管该表的状态如何。销售编号只是一个抽象,我报告的其他一些信息并不是唯一的。 这些结果中是否还应该有Sales/131415/PlanXYZ/3Accounting/789/PlanXYZ/3 【参考方案1】:

如果你的表设置如下:

| Sale No | Widget |
|---------|--------|
| 1       | Foo    |
| 2       | Bar    |
| 3       | Foo    |
| 4       | Foo    |
| 5       | Bar    |
| 6       | Foo    |
| 7       | Foo    |
| 8       | Bar    |
| 9       | Bar    |
| 10      | Foo    |

您不能包含Sale No,因为它会将值分组。

 SELECT     Widget
            , COUNT(Widget) AS [Total Sold]    
 FROM       sometable
 GROUP BY   Widget  

只需添加小部件并对其进行分组即可返回:

| Widget | Total Sold |
|--------|------------|
| Bar    | 4          |
| Foo    | 6          |  

另一方面,如果您的 Sale No 字段重复,那么您可以获得每个 Sale No 的计数。

| Sale No | Widget |
|---------|--------|
| 1       | Foo    |
| 1       | Bar    |
| 5       | Foo    |
| 5       | Foo    |
| 5       | Bar    |
| 7       | Foo    |
| 7       | Foo    |
| 7       | Bar    |
| 7       | Bar    |
| 10      | Foo    |  

这里添加了Sale No,查询按所有未聚合的字段分组。

 SELECT     [Sale No]
            , Widget
            , COUNT(Widget) As [Total Sold]
 FROM       sometable
 GROUP BY   [Sale No]
            , Widget  

这将返回这个表:

| Sale No | Widget | Total Sold |
|---------|--------|------------|
| 1       | Bar    | 1          |
| 1       | Foo    | 1          |
| 5       | Bar    | 1          |
| 5       | Foo    | 2          |
| 7       | Bar    | 2          |
| 7       | Foo    | 2          |
| 10      | Foo    | 1          |

编辑: 根据提供的表,此 SQL 应该给出正确的结果:

SELECT      T1.Department
            , T1.Employee
            , T1.Policy
            , COUNT(T2.Policy)
FROM        sometable T1 INNER JOIN sometable T2 ON T1.Policy = T2.Policy
GROUP BY    T1.Department
            , T1.Employee
            , T1.Policy  

结果表:

| Department | Employee | Policy  | Expr1003 |
|------------|----------|---------|----------|
| Accounting | 789      | PlanXYZ | 3        |
| Accounting | 101112   | PLanXYZ | 3        |
| Admin      | 161718   | PLanJKL | 1        |
| Sales      | 123      | PlanABC | 1        |
| Sales      | 456      | PalnABC | 1        |
| Sales      | 131415   | PlanXYZ | 3        |

【讨论】:

我不知道这真的是我想要做的事情。这就是我要找的东西。从 myquery 中获取 status = foo 的所有记录。对于每个返回的记录计数,此其他字段在同一个表中出现的次数。本质上,这是一个两阶段操作。这只是为了一份报告,我只需要在几分钟内运行,而不是几小时。我希望有一种方法可以将第二部分存储在内存中,这样我就不必继续运行 Count(*) From table where field = "valuefrompart1" 您能否在问题中添加一些反映您的实际数据的示例数据。

以上是关于在没有重新查询的情况下访问另一个表中的查询计数记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用计数查询来(自动)更新表中的列

oracle sql中根据其他表中的计数重新启动rownumber

SQL 合并计数结果

查询并将数据插入一个数据库到另一个数据库

使用 Sequelize 包含子句查询在另一个表中没有条目的记录

在不使用 VBA/Access 中的内联查询的情况下向表中添加记录