好的,我有一个查询,需要在输出中显示所有周末日期,以及在星期日开始并在星期六结束的一周内审核callID
的计数?
目前我正在插入startdate和enddate,但这不会累积输出中的周末。
我希望在输出中看到的是:
周末2/7/2015计数15(每位主管)
周末2/14/2015计数25
周末2/21/2015计数9
SELECT DISTINCT [Coach]。[LastName]& “,”& [Coach]。[FirstName] AS CoachName,Count(S.CallId)AS [Count],tblLocations.LocationName,S.DateScored FROM tblLocations INNER JOIN(tblScores AS S INNER JOIN tblEmployees AS Coach ON S.CoachId = Coach.ID)ON tblLocations.ID = S.LocationId GROUP BY [教练]。[LastName]& “,”& [Coach]。[FirstName],tblLocations.LocationName,Coach.Source,S.Completed,S.DateScored HAVING(((tblLocations.LocationName)=“Nashville”或(tblLocations.LocationName)=“Solon”或(tblLocations.LocationName)=“San Antonio”或(tblLocations.LocationName)=“Phoenix”)AND((Coach.Source) )=“主管”)AND((S.Completed)= Yes)AND((S.DateScored)> = [开始日期]和(S.DateScored)< = [结束日期]));
答案 0 :(得分:2)
您必须使用一些Access SQL函数:IIF()
,Weekday()
和DateAdd()
。基本上,您必须找到日期weekday number(1-7,对应于周日 - 周六),然后添加相应的值以获取所有日期以返回周六日期:
SELECT [Coach].[LastName] & ", " & [Coach].[FirstName] AS CoachName,
Count(S.CallId) AS [CountOfSupervisors], tblLocations.LocationName,
IIF(Weekday(S.DateScored) = 7, S.DateScored,
IIF(Weekday(S.DateScored) = 6, DateAdd('d', 1, S.DateScored),
IIF(Weekday(S.DateScored) = 5, DateAdd('d', 2, S.DateScored),
IIF(Weekday(S.DateScored) = 4, DateAdd('d', 3, S.DateScored),
IIF(Weekday(S.DateScored) = 3, DateAdd('d', 4, S.DateScored),
IIF(Weekday(S.DateScored) = 2, DateAdd('d', 5, S.DateScored),
IIF(Weekday(S.DateScored) = 1, DateAdd('d', 6, S.DateScored), Null))))))) As EndOfWeek
FROM tblLocations INNER JOIN (tblScores AS S
INNER JOIN tblEmployees AS Coach ON S.CoachId = Coach.ID) ON tblLocations.ID = S.LocationId
WHERE (((tblLocations.LocationName IN ('Nashville','Solon','San Antonio','Phoenix') AND
((Coach.Source)='Supervisor') AND ((S.Completed)=Yes) AND
((S.DateScored)>=[Start Date] And (S.DateScored)<=[End Date]))
GROUP BY [Coach].[LastName] & ", " & [Coach].[FirstName], tblLocations.LocationName,
Coach.Source, S.Completed,
IIF(Weekday(S.DateScored) = 7, S.DateScored,
IIF(Weekday(S.DateScored) = 6, DateAdd('d', 1, S.DateScored),
IIF(Weekday(S.DateScored) = 5, DateAdd('d', 2, S.DateScored),
IIF(Weekday(S.DateScored) = 4, DateAdd('d', 3, S.DateScored),
IIF(Weekday(S.DateScored) = 3, DateAdd('d', 4, S.DateScored),
IIF(Weekday(S.DateScored) = 2, DateAdd('d', 5, S.DateScored),
IIF(Weekday(S.DateScored) = 1, DateAdd('d', 6, S.DateScored), Null)))))));
或者,这是一个不太详细的解决方案,由@HansUp标识,没有嵌套的IIF()
语句:
SELECT [Coach].[LastName] & ", " & [Coach].[FirstName] AS CoachName,
Count(S.CallId) AS [CountOfSupervisors], tblLocations.LocationName,
DateAdd('d', IIf(S.DateScored Is Null, 0, 7 - Weekday(S.DateScored)), S.DateScored) As EndOfWeek
FROM tblLocations INNER JOIN (tblScores AS S
INNER JOIN tblEmployees AS Coach ON S.CoachId = Coach.ID) ON tblLocations.ID = S.LocationId
WHERE (((tblLocations.LocationName IN ('Nashville','Solon','San Antonio','Phoenix') AND
((Coach.Source)='Supervisor') AND ((S.Completed)=Yes) AND
((S.DateScored)>=[Start Date] And (S.DateScored)<=[End Date]))
GROUP BY [Coach].[LastName] & ", " & [Coach].[FirstName], tblLocations.LocationName,
Coach.Source, S.Completed,
DateAdd('d', IIf(S.DateScored Is Null, 0, 7 - Weekday(S.DateScored)), S.DateScored);
您会注意到我调整了一些代码。您可以将所有HAVING
语句移动到WHERE
子句中(表示聚合时使用HAVING
- Count,Sum,Avg,First,Last)。此外,您可以将IN()
子句用于多个OR条件。希望这有效!