我是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语句输出这种信息?欢迎更正/建议。
答案 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语句。