MS Access SQL语句计数用法

时间:2012-04-21 14:14:06

标签: sql ms-access

我是SQL新手。我接受了一个课程作业,报告了过去2个月的使用情况。有人可以帮我解决SQL语句吗?

SELECT COUNT(Member_ID,Non_Member_Name) AS Pool_usage_last_2_months
FROM Use_of_pool
WHERE DATEDIFF(‘2012-04-21’,’2012-02-21’) 

我打算做的是计算过去两个月内的会员使用总数(member_ID)和非会员使用情况(仅限ID,姓名),然后输出姓名,日期和时间等。在同一份报告上。是否有任何SQL语句输出这种信息?欢迎更正/建议。

2 个答案:

答案 0 :(得分:1)

您需要一个不同的WHERE子句。假设您的Use_of_pool表格包含日期/时间字段date_field

WHERE date_field >= #2012-02-21# AND date_field <= #2012-04-21#

如果date_field值可以包含午夜以外的时间组件,请将结束日期范围提前一天,以捕获4月21日之后的所有可能日期/时间值:

WHERE date_field >= #2012-02-21# AND date_field <= #2012-04-22#

这应该限制行匹配我想要的。它应该提供具有date_field索引的快速性能。

我不清楚你想要的数量......是否是所有访问的一个计数(成员和非成员),或成员和非成员的单独计数。

修改:如果表格的每一行代表一个人的访问,您只需计算行数即可确定所选时间段内的访问次数。

SELECT Count(*) AS CountOfVisits
FROM Use_of_pool
WHERE date_field >= #2012-02-21# AND date_field <= #2012-04-21#

请注意,同一个人的每次访问都会对CountOfVisits做出贡献,这就是我认为您想要的。如果您想知道访问了多少人,我们需要采用不同的方法。

<强> EDIT2 : 听起来您可以使用Member_ID和Non_Member_Name来区分成员访问和非成员访问。对于非成员,Member_ID为Null,对于成员,Member_ID为非Null。并且Non_Member_Name对于成员是Null而对于非成员是非Null。

如果确实如此,请尝试此查询以单独计算成员和非成员访问次数。

SELECT
    Sum(IIf(Member_ID Is Not Null, 1, 0)) AS member_visits,
    Sum(IIf(Non_Member_Name Is Not Null, 1, 0)) AS non_member_visits
FROM Use_of_pool
WHERE date_field >= #2012-02-21# AND date_field <= #2012-04-21#

答案 1 :(得分:0)

SQL的聚合函数使用列中的所有数据(更准确地说,WHERE子句选择的所有数据)来生成单个数据。 COUNT为您提供与WHERE子句匹配的数据行数。例如:

SELECT COUNT(*) AS Non_members FROM Use_of_pool WHERE Member_ID IS NULL

将为您提供非成员使用池的次数,

SELECT COUNT(DISTINCT Member_ID) AS Members FROM Use_of_pool

将为您提供至少使用过一次池的成员数量(DISTINCT告诉数据库引擎在计算时忽略重复项)。

您可以展开WHERE子句以进一步指定要计算的内容。如果“过去两个月”表示当前和上一个日历月,则需要:

... WHERE DateDiff("m",Date_field,Date())<=1

如果这意味着滚动的2个月期限,那么我会在60天内估算一下

... WHERE DateDiff("d",Date_field,Date())<60

(将Date_field替换为包含日期的字段的名称。)

如果要根据多个不同的标准计算行数,或者输出聚合数据和单个数据,最好使用单独的SELECT语句。