如何在 Access 查询中计算表中的特定值

问题描述

我在查询列上使用 Dcount 以从另一个表中获取多少 1。我在 Dcount 的参数中给出了当前查询列的值,如下所示。

DCount("AttnStatus","InstructorAttendance","AttnStatus=1 And AttnDate>=#" & [FD] & "# And AttnDate<=#" & [LD] & "# And iuiD=" & [Instructorutilization].[iuiD])

数据库

SELECT qryAttendance_Crosstab.iuiD,PL.PL,SubPL.SubPL,qryAttendance_Crosstab.MN,Instructor.InstructorName,InstructorRole.InstructorRole,Country.Country,qryAttendance_Crosstab.[1],qryAttendance_Crosstab.[2],qryAttendance_Crosstab.[3],qryAttendance_Crosstab.[4],qryAttendance_Crosstab.[5],qryAttendance_Crosstab.[6],qryAttendance_Crosstab.[7],qryAttendance_Crosstab.[8],qryAttendance_Crosstab.[9],qryAttendance_Crosstab.[10],qryAttendance_Crosstab.[11],qryAttendance_Crosstab.[12],qryAttendance_Crosstab.[13],qryAttendance_Crosstab.[14],qryAttendance_Crosstab.[15],qryAttendance_Crosstab.[16],qryAttendance_Crosstab.[17],qryAttendance_Crosstab.[18],qryAttendance_Crosstab.[19],qryAttendance_Crosstab.[20],qryAttendance_Crosstab.[21],qryAttendance_Crosstab.[22],qryAttendance_Crosstab.[23],qryAttendance_Crosstab.[24],qryAttendance_Crosstab.[25],qryAttendance_Crosstab.[26],qryAttendance_Crosstab.[27],qryAttendance_Crosstab.[28],qryAttendance_Crosstab.[29],qryAttendance_Crosstab.[30],qryAttendance_Crosstab.[31],qryAttendance_Crosstab.[Total Days],IIf(IsNumeric(Nz([Total Days],0)/(DateDiff("d",[MN],DateSerial(Year([MN]),Month([MN])+1,1)-1)-([Days]-1))),Nz([Total Days],1)-1)-([Days]-1)),0) AS Availability,Month([MN]),1) AS FD,1)-1 AS LD,DCount("AttnStatus","AttnStatus=1 And AttnDate>=#" & [FD] & "# And AttnDate<=#" & [LD] & "# And iuiD=" & [Instructorutilization].[iuiD]) AS Training
FROM InstructorRole INNER JOIN 
((Country INNER JOIN Instructor ON Country.CountryID = Instructor.Country) INNER JOIN ((SubPL INNER JOIN (PL INNER JOIN (qryAttendance_Crosstab RIGHT JOIN Instructorutilization ON qryAttendance_Crosstab.iuiD = Instructorutilization.iuiD) ON PL.PLID = Instructorutilization.PL) ON SubPL.SubPLID = Instructorutilization.SubPL) LEFT JOIN WeekendAndHolidays ON qryAttendance_Crosstab.MN = WeekendAndHolidays.MonthDay) ON Instructor.InstructorID = Instructorutilization.InstructorID) ON InstructorRole.IRID = Instructor.InstructorRole
ORDER BY PL.PL,Instructor.InstructorName;

enter image description here

下面给出了我尝试使用‌Dcount 从中检索信息的表的结构。

教员出勤表:

enter image description here

在第一行返回正确的值。但问题是,下一行的计数值逐渐增加,没有给出正确的回报。

我实际上以什么方式得到正确的结果?

解决方法

考虑:

SELECT qryAttendance_Crosstab.*,PL.PL,SubPL.SubPL,InstructorName,InstructorRole,Country.Country,DCount("*","InstructorAttendance","IUID=" & [IUID] & " AND AttnStatus=1 
       AND Format([AttnDate],'yyyymm')=" & Format([Month],"yyyymm")) AS Training
...

或者代替 DCount(),构建一个聚合查询。

SELECT IUID,Format([AttnDate],"yyyymm") AS AttYYYYMM,Count(*) AS CountStatus
FROM InstructorAttendance
WHERE AttnStatus=1
GROUP BY IUID,"yyyymm");

计算交叉表查询中的 YYYYMM 字段。使用 IUID 和 YYYYMM 字段上的复合链接将聚合查询加入交叉表查询。

出勤日期显示为国际格式。注意与国际日期相关的问题,查看 http://allenbrowne.com/ser-36.html

建议不要重复表和字段的名称。例如,Countries 最好作为表名,Country 作为字段名,最好不要在多个表中使用 IUID