Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL for MS Access:关于计数、联接、0和日期的另一个问题_Sql_Ms Access - Fatal编程技术网

SQL for MS Access:关于计数、联接、0和日期的另一个问题

SQL for MS Access:关于计数、联接、0和日期的另一个问题,sql,ms-access,Sql,Ms Access,我问。然而,尽管这回答了我最初的问题,我有更多的问题 我有一张电话桌 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

我问。然而,尽管这回答了我最初的问题,我有更多的问题

我有一张电话桌

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
我使用下面的查询来获得电话表中每个等级的计数,它非常有效

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

干杯

试试这个:

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;
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;

那完全不同。 您希望将一系列单独的日期与第一个表连接起来,而between子句不会这样做

我想你需要一张表格,上面有你想要的所有日期,比如从2010年1月1日到2010年12月31日,或者你需要支持的任何范围。一列,365行或任意多行,每个行有一个日期值

然后将该表和带有日期和等级的表连接起来,并根据日期范围进行限制, 然后进行聚合以计数


一步一个脚印,就更容易理解了。

创建一个关于电话的单独查询,使用您在2010年7月19日至2010年7月23日之间的限制条件

qryTelephonyDateRange:

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

LEFT JOIN qryTelephonyDateRange ON grade.ID=qryTelephonyDateRange.Grade
而不是

LEFT JOIN telephony ON grade.ID=telephony.Grade
对于qryTelephonyDateRange,可以使用子查询而不是单独的命名查询

注日期是一个保留字,因此我将名称括起来以避免歧义。。。Access数据库引擎将理解它应该查找名为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;

我让它工作的方式是:

创建一个名为Dates的表,其中包含一个名为MyDate的主键date/time字段,我支持HansUp,不使用date之类的保留字作为字段名。 用我想要的2010年7月19日至2010年7月23日的日期值填充表格,如您的示例所示。 使用以下SQL语句编写查询

选择x.MyDate作为[日期],选择x.ID,选择Countt.ID作为总计 从中选择Dates.MyDate、Grade.ID FROM Dates、Grade AS x 在x.MyDate=t.Date和x.ID=t.Grade上以t的形式左键连接电话 按x.MyDate、x.ID分组

这应该会得到你要求的结果

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

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

一旦你有了它,那么它就只是一个到电话表的外部联接来完成其余的工作。

你能解释一下我将如何使用子查询吗?谢谢工作的很好,但是我想分组的t.日期以及g.ID。当我把它加进去时,它仍然只返回带有等级值的日期。有什么想法吗?谢谢你的帮助。我修改了示例查询。看看这是不是你想要的。干杯,我真的很感激,我就快到了。如果未找到某个等级,则报告为0,但仅报告一次。不是每个日期都报告为0。最后一个问题,我保证!