在 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 中的查询错误