Access 2007:如何进行周末开始和周末,并在结果中显示周结束日期

时间:2015-04-03 18:04:09

标签: ms-access ms-access-2007

好的,我有一个查询,需要在输出中显示所有周末日期,以及在星期日开始并在星期六结束的一周内审核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)< = [结束日期]));

1 个答案:

答案 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条件。希望这有效!

相关问题