2

我是 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 语句可以输出此类信息?欢迎更正/建议。

4

2 回答 2

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,对于成员为非 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#
于 2012-04-21T15:13:27.240 回答
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 语句。

于 2012-04-21T14:49:37.250 回答