【问题标题】:Count Distinct in a Group By aggregate function in Access 2007 SQL在 Access 2007 SQL 中的 Group By 聚合函数中计数 Distinct
【发布时间】: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;

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

【问题讨论】:

    标签: sql ms-access-2007


    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-23
          • 2012-12-07
          • 1970-01-01
          • 1970-01-01
          • 2014-08-24
          • 1970-01-01
          相关资源
          最近更新 更多