2

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

CustomerID
test1
test1
test2
test3
test4
test4

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

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

-- 2012 年 6 月 27 日更新 --

谢谢,两者都为我工作:

  1. SELECT COUNT(*) FROM (SELECT CustomerID From TheTable GROUP BY CustomerID) as
  2. SELECT COUNT(*) FROM (SELECT DISTINCT CustomerID FROM TheTable) AS sub;

我现在需要一个查询来只保留今天添加的那些 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());

4

2 回答 2

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
于 2012-06-26T05:48:29.410 回答
3

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

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

我不知道它是否比 dbaseman 的GROUP BY. 如果您决定测试这两种方法,请添加评论告诉我们您发现了什么。

根据您的评论,您想评估“仅今天添加的那些记录”。由于您没有向我们提供有关您的表的足够信息,我将假装它包含一个名为的日期/时间字段date_added。每次添加记录时,您都会在该字段中存储当前日期,时间部分为午夜。在这种情况下,您可以向子查询添加一个WHERE子句,要求数据库引擎仅考虑那些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)
于 2012-06-26T15:38:33.997 回答