4

你好我已经浏览了一段时间的论坛,在这里问我的第一个问题。我有点纠结,想知道是否可以得到一些帮助。我正在使用 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;

希望我在这里很清楚,就像我说我的第一篇文章一样,任何帮助都将不胜感激。

4

3 回答 3

7

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

SELECT cd.DiagCode, Count(cd.CustomerID)
FROM (select distinct DiagCode, CustomerID from CustomerTable) as cd 
Group By cd.DiagCode;
于 2013-08-01T12:49:02.807 回答
4

我有同样的问题,并在 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;
于 2013-11-12T18:28:17.927 回答
1

这适用于 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
于 2015-04-03T18:58:38.643 回答