【问题标题】:MS ACCESS count/sum number of rows, with no duplicatesMS ACCESS 计数/总和行数,没有重复
【发布时间】:2012-06-27 10:01:38
【问题描述】:

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

CustomerID
test1
test1
test2
test3
test4
test4

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

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

-- 27/06/2012 更新--

谢谢,两者都为我工作:

  1. SELECT COUNT(*) FROM (SELECT CustomerID FROM TheTable GROUP BY CustomerID) as
  2. 选择计数(*) 从 ( 从表中选择不同的客户 ID ) 作为子;

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

【问题讨论】:

    标签: sql ms-access count distinct


    【解决方案1】:

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

    SELECT COUNT(DISTINCT CustomerID) FROM TheTable 
    

    编辑:根据 cmets 中的 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
    

    【讨论】:

    • 第二个答案是正确的。访问没有 COUNT(DISTINCT)。您需要创建一个子查询,该子查询按您想要区分的字段分组并计算在内。
    • @dbaseman 嗨,这对我有用。然后我尝试编写另一行条件查询,它将只保留今天添加的那些记录并计算它们,您能否参考我的第一篇文章,看看我在代码中做错了什么?感谢您的帮助。
    • @user1481722 在这种情况下,您可能需要考虑打开另一个问题。但请参阅我更新的答案,希望对您有所帮助。 (我假设您的表有一个名为 DateAdded 或类似名称的列,用于跟踪时间戳。)
    【解决方案2】:

    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 值包含除午夜以外的任何时间组件,则您必须修改 WHERE 子句以捕获从今天开始的所有日期/时间值。

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

    【讨论】:

    • 嗨,这对我也有用,但我还有一个无法解决的问题,你能看看我在顶部的第一篇文章吗?谢谢。
    • 我试过了,你对 data_added (没有时间分量)是正确的,但是,当我尝试 SELECT COUNT(*) FROM ( SELECT DISTINCT CustomerID FROM TheTable WHERE date_added = Date()) AS子;它不起作用,无论是语法还是括号错误。不过这很奇怪,因为您和@dbaseman 为我的第一个问题提供的查询最初运行良好,但是在我修改任何内容之后,即使只添加了一个空格字符,它们也变得很糟糕..
    • 如果您使用的是 Access 2003,请在 Access 报错后切换回 SQL 视图,并检查它是否更改了围绕子查询的支持。
    • 嘿@HansUp,我用子查询外的方括号替换了开括号,现在一切正常。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2010-10-31
    • 2023-03-28
    • 2023-03-07
    • 2012-09-16
    相关资源
    最近更新 更多