用于MS Access的SQL:关于COUNT,JOIN,0和Dates的另一个问题

时间:2010-08-05 15:53:07

标签: sql ms-access

我问a question regarding joins yesterday。然而,虽然这回答了我最初的问题,但我遇到了更多问题。

我有一个电话表

ID | Date | Grade
1 07/19/2010 Grade 1
2 07/19/2010 Grade 1
3 07/20/2010 Grade 1
4 07/20/2010 Grade 2
5 07/21/2010 Grade 3

我还有一个成绩表

ID | Name
1 Grade 1
2 Grade 2
3 Grade 3
4 Grade 4
5 Grade 5
6 Grade 6
7 Grade 7
8 Grade 8
9 Grade 9
10 Grade 10
11 Grade 11
12 Grade 12

我使用以下查询来获取电话表中每个年级的COUNT,效果很好。

SELECT grade.ID, Count(telephony.Grade) AS Total
FROM grade LEFT JOIN telephony ON grade.ID=telephony.Grade
GROUP BY grade.ID
ORDER BY 1;

返回

ID | Total
1 3
2 1
3 1
4 0
5 0
6 0
7 0
8 0
9 0
10 0
11 0
12 0

但是,我要做的是以下内容:

按日期分组,仅在两个日期之间返回结果

SELECT telephony.Date, grade.ID, Count(telephony.Grade) AS Total
FROM grade LEFT JOIN telephony ON grade.ID=telephony.Grade
WHERE telephony.Date BETWEEN #07/19/2010# AND #07/23/2010#
GROUP BY telephony.Date, grade.ID
ORDER BY 1;

我收到以下

Date | ID | Total
07/19/2010 1 2
07/20/2010 1 1
07/20/2010 2 1
07/21/2010 3 1

它没有返回两个日期之间有0个条目的所有成绩,只返回这些日期的条目。我正在寻找的是这样的:

Date | ID | Total
07/19/2010 1 2
07/19/2010 2 0
07/19/2010 3 0
07/19/2010 4 0
07/19/2010 5 0
07/19/2010 6 0
07/19/2010 7 0
07/19/2010 8 0
07/19/2010 9 0
07/19/2010 10 0
07/19/2010 11 0
07/19/2010 12 0
07/20/2010 1 1
07/20/2010 2 1
07/20/2010 3 0
07/20/2010 4 0
07/20/2010 5 0
07/20/2010 6 0
07/20/2010 7 0
07/20/2010 8 0
07/20/2010 9 0
07/20/2010 10 0
07/20/2010 11 0
07/20/2010 12 0
07/21/2010 1 2
07/21/2010 2 0
07/21/2010 3 1
07/21/2010 4 0
07/21/2010 5 0
07/21/2010 6 0
07/21/2010 7 0
07/21/2010 8 0
07/21/2010 9 0
07/21/2010 10 0
07/21/2010 11 0
07/21/2010 12 0
07/22/2010 1 2
07/22/2010 2 0
07/22/2010 3 0
07/22/2010 4 0
07/22/2010 5 0
07/22/2010 6 0
07/22/2010 7 0
07/22/2010 8 0
07/22/2010 9 0
07/22/2010 10 0
07/22/2010 11 0
07/22/2010 12 0
07/23/2010 1 2
07/23/2010 2 0
07/23/2010 3 0
07/23/2010 4 0
07/23/2010 5 0
07/23/2010 6 0
07/23/2010 7 0
07/23/2010 8 0
07/23/2010 9 0
07/23/2010 10 0
07/23/2010 11 0
07/23/2010 12 0

我希望有人可以提供帮助。我正在使用Microsoft Access 2003。

干杯

4 个答案:

答案 0 :(得分:1)

使用BETWEEN #07/19/2010# AND #07/23/2010#约束在电话上创建单独的查询。

<强> qryTelephonyDateRange

SELECT *
FROM telephony
WHERE [Date] BETWEEN #07/19/2010# AND #07/23/2010#;

然后,在原始查询中,使用:

LEFT JOIN qryTelephonyDateRange ON grade.ID=qryTelephonyDateRange.Grade

而不是

LEFT JOIN telephony ON grade.ID=telephony.Grade

您可以使用子查询而不是qryTelephonyDateRange的单独命名查询。

注意Date是一个保留字,因此我将名称括起来以避免歧义......访问'数据库引擎将理解它应该是在寻找名为Date而不是VBA Date()函数的字段。但是,如果它是我的项目,我会重命名该字段以避免歧义...将其命名为tDate。

更新:您要求查看子查询方法。试试这个:

SELECT g.ID, t.[Date], Count(t.Grade) AS Total
FROM
    grade AS g
    LEFT JOIN (
        SELECT Grade, [Date]
        FROM telephony
        WHERE [Date] BETWEEN #07/19/2010# AND #07/23/2010#
        ) AS t
    ON g.ID=t.Grade
GROUP BY g.ID, t.[Date]
ORDER BY 1, 2;

答案 1 :(得分:0)

试试这个:

SELECT grade.ID, Count(telephony.Grade) AS Total
FROM grade LEFT JOIN telephony ON grade.ID=telephony.Grade
GROUP BY grade.ID
HAVING COUNT(telephony.Grade) > 0
ORDER BY grade.ID;

答案 2 :(得分:0)

那是完全不同的。 您希望与第一个表一起加入一系列单独的日期,而且之间的子句不会为您执行此操作。

我认为您需要一张包含您想要的所有日期的表格,例如2010年1月1日至2010年12月31日,或者您需要支持的任何范围。一列,365行或多行,每行有一个日期值。

然后将该表与日期和成绩相关联,并按日期范围限制, 然后进行聚合计数。

一步一步,更容易理解。

答案 3 :(得分:0)

我开始工作的方式是:

  1. 创建一个名为Dates的表,其中包含一个名为MyDate的主键日期/时间字段(我使用HansUp时不使用字段名称的“Date”等保留字)。
  2. 在表格中填写我想要的日期值(2010年7月19日至2010年7月23日,如您的示例所示)。
  3. 使用以下SQL语句编写查询

    SELECT x.MyDate AS [Date],x.ID,Count(t.ID)AS Total FROM(SELECT Dates.MyDate,Grade.ID FROM Dates,Grade)AS x LEFT JOIN Telephony AS t ON(x.MyDate = t.Date)AND(x.ID = t.Grade) GROUP BY x.MyDate,x.ID;

  4. 那应该得到你要求的结果。

    SQL中的子查询语句创建了一个交叉连接,以便在日期表和等级表中的等级中获取日期的每个组合。

    (SELECT Dates.MyDate, Grade.ID FROM Dates, Grade)  AS x
    

    有了这个,那么它只是Telephony表的外部联接来完成剩下的工作。