我有同样的问题,并在 Microsoft 的 Access Team 中找到了一个链接(现已失效),其中有一个很好的工作示例来说明如何实现这一点;我也将包括在下面。
数据:
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;