在 Access 2007 SQL 中的 Group By 聚合函数中计数 Distinct

Posted

技术标签:

【中文标题】在 Access 2007 SQL 中的 Group By 聚合函数中计数 Distinct【英文标题】:Count Distinct in a Group By aggregate function in Access 2007 SQL 【发布时间】:2013-08-01 12:41:44 【问题描述】:

您好,我浏览了论坛一段时间,在这里问我的第一个问题。我有点纠结,想知道是否可以得到一些帮助。我正在使用 Access 2007,但尚未在网上找到该问题的好答案。

我的数据是诊断代码和客户 ID,我正在寻找的是为什么要找到每个诊断代码的客户 ID 的不同计数。理想情况下,在非 Access SQL 中应该如下所示:

SELECT DiagCode, Count(Distinct(CustomerID))
FROM CustomerTable
Group By DiagCode;

我知道这是一个非常简单的问题,但我找到的答案要么太复杂(多个聚合函数)要么太简单。这是我解决它的一种方法,但这会返回太多结果:

SELECT DiagCode, Count(CustomerID)
FROM CustomerTable
WHERE CustomerID in (SELECT Distinct CustomerID from CustomerTable)
Group By DiagCode;

希望我在这里很清楚,就像我在第一篇文章中所说的那样,感谢任何帮助。

【问题讨论】:

【参考方案1】:

我不是 MS Access 方面的专家,上次我为它写任何东西已经很久了,但这可能会奏效:

SELECT cd.DiagCode, Count(cd.CustomerID)
FROM (select distinct DiagCode, CustomerID from CustomerTable) as cd 
Group By cd.DiagCode;

【讨论】:

【参考方案2】:

我有同样的问题,并找到了 Microsoft 访问团队提供的链接(现已失效),其中有一个很好的工作示例来说明如何完成此操作;我也将包括在下面。


数据:

Color   Value
Red     5
Green   2
Blue    8
Orange  1
Red     8
Green   6
Blue    2

要计算表中唯一颜色的数量,您可以编写如下查询:

SELECT Count(Distinct Color) AS N FROM tblColors

这将返回值 4,因为表中的颜色字段中有四种唯一颜色。不幸的是,Access 数据库引擎不支持 Count(Distinct) 聚合。要从 Access 表中返回此值,您需要使用子查询,例如:

SELECT Count(*) AS N
FROM 
(SELECT DISTINCT Color FROM tblColors) AS T;

现在假设您还想包含另一个聚合值,例如 Sum,并希望按某个值(在本例中为 Color)进行分组。在 SQL Server 上,您可以将此查询编写为:

SELECT Color, Sum(Value) AS Total, Count(Distinct Color) AS N
FROM tblColors
GROUP BY Color

这提供了以下结果:

数据:

Color   Total   N
Blue    10      1
Green   8       1
Orange  1       1
Red     13      1

现在,如果你问这是否应该返回 '1' 的值,答案是肯定的。据我了解,这里的 Count(Distinct) 可以用作验证给定查询结果的测试。

如果您的数据位于支持 Count(Distinct) 的服务器上,您也许可以使用传递查询来检索结果。如果您正在使用 Access 数据,这将变得更具挑战性。

由于我们对上一个查询使用了子查询,因此我们需要在此处执行相同的操作。然而,诀窍是我们需要使用两个子查询,如以下 SQL 所示:

SELECT C.Color, Sum(C.Value) AS Total, T2.N
FROM
    (SELECT T.Color, Count(T.Color) AS N 
     FROM 
        (SELECT DISTINCT Color, Count(*) AS N 
         FROM tblColors GROUP BY Color) AS T 
    GROUP BY T.Color) AS T2 
INNER JOIN tblColors AS C
ON T2.Color = C.Color
GROUP BY C.Color, T2.N;

【讨论】:

【参考方案3】:

这适用于 Access 2007 和 2010:

select format(sum(bpa_ext_price) /
              (select count(*) from (select distinct ord_num from sales)),
             "standard") AS Avg_Ord_Amt
from   sales

【讨论】:

以上是关于在 Access 2007 SQL 中的 Group By 聚合函数中计数 Distinct的主要内容,如果未能解决你的问题,请参考以下文章

Access 2007 中的 SQL 查询有效,但在报表中的表达式生成器中无效(结果为 #name?)

Access 2007 使用 VBA/SQL 语句中列表框中的 ID 值

尝试连接到 SQL 表时,MS Access 2007 中的查询错误

MS Access 2007 中的 SQL JOIN 问题

按计数排序未正确排序 - SQL (MS Access 2007)

Access 2007 组合框显示表中的错误结果