MS ACCESS计数/总和行数,没有重复

时间:2012-06-26 05:43:42

标签: sql ms-access count distinct

我有下表,我需要计算总行数而不包括任何重复记录。

CustomerID
test1
test1
test2
test3
test4
test4

如您所见,行总数为6,但有两个test1和两个test4,我希望查询返回4. IOW,我想计算CustomerID中的唯一值。

我尝试了子查询,但没有让它为我工作。

- 更新27/06/2012 -

谢谢,两人都为我工作:

  
      
  1. SELECT COUNT(*)FROM(选择CustomerID FROM TheTable GROUP BY CustomerID)为
  2.   
  3. SELECT COUNT(*)   从   (       从TheTable中选择DISTINCT CustomerID   )AS sub;
  4.   

我现在需要一个查询来保留今天添加的那些CustomerID,然后计算它们。

例如,

CustomerID DateAdded
test1 25/06/2012
test1 25/06/2012
test2 26/06/2012
test3 27/06/2012 - Today
test4 27/06/2012 - Today
test4 27/06/2012 - Today

然后它需要返回3.

我已经尝试将以下查询添加到提供的两个解决方案中,但无法让它们中的任何一个工作/返回我想要的值。

  

HAVING(([TheTable] .DateAdded)= Date());

2 个答案:

答案 0 :(得分:4)

这可以在SQL中工作,我认为它也应该在Access中:

SELECT COUNT(DISTINCT CustomerID) FROM TheTable 

编辑:根据评论中的Jeff,Access不支持上述语法。

这应该可以肯定:

SELECT COUNT(*) FROM ( SELECT CustomerID FROM TheTable GROUP BY CustomerID ) a

按日期限制

SELECT COUNT(*) FROM ( 
    SELECT TheTable.CustomerID FROM TheTable GROUP BY CustomerID 
    WHERE TheTable.DateAdded >= Date()
) a

答案 1 :(得分:3)

dbaseman的回答中的第二个建议对我来说是正确的。这种替代方案也应该有效。

SELECT COUNT(*)
FROM
    (
        SELECT DISTINCT CustomerID FROM TheTable
    ) AS sub;

我不知道它是否比dbaseman GROUP BY提供任何优势。如果您决定测试这两种方法,请添加评论以告诉我们您找到的内容。

根据您的评论,您想要评估“仅限那些今天添加的记录”。由于您没有向我们提供有关您的表的足够信息,我将假装它包含名为date_added的日期/时间字段。每次添加记录时,都会在该字段中存储当前日期,时间组件为午夜。在这种情况下,您可以向子查询添加WHERE子句,以要求db引擎仅考虑date_added等于今天日期的那些行。 Date()函数将为您提供今天的日期,午夜作为时间组件。

SELECT COUNT(*)
FROM
    (
        SELECT DISTINCT CustomerID FROM TheTable
        WHERE date_added = Date()
    ) AS sub;

使用您的字段名称替换date_added后,如果我的假设是正确的,这应该可行。但是,如果您的date_added值包含midnite以外的任何时间组件,则必须修改WHERE子句以从今天开始捕获所有日期/时间值。

WHERE date_added >= Date() AND date_added < (Date() + 1)