我问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。
干杯
答案 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)
我开始工作的方式是:
使用以下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;
那应该得到你要求的结果。
SQL中的子查询语句创建了一个交叉连接,以便在日期表和等级表中的等级中获取日期的每个组合。
(SELECT Dates.MyDate, Grade.ID FROM Dates, Grade) AS x
有了这个,那么它只是Telephony表的外部联接来完成剩下的工作。