Вы должны будете использовать несколько функций SQL Access: IIF()
, Weekday()
и DateAdd()
. По существу, вы должны найти weekday number (1-7, что соответствует Sun-Sat), а затем добавить соответствующее значение, чтобы получить все даты, чтобы вернуть даты субботу Дейта:
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
используется, когда агрегаты выражены - количество, сумма, средняя, первая, последняя). Кроме того, вы можете использовать предложение IN()
для нескольких условий ИЛИ. Надеюсь, это сработает!
Рассмотрим 'DateAdd ('d', IIf (S.DateScored Is Null, 0, 7 - Weekday (S.DateScored)), S.DateScored) AS EndOfWeek' вместо этих вложенных выражений' IIf'. Также 'SELECT DISTINCT' не полезен в запросе' GROUP BY'. – HansUp
Спасибо всем, и я отвечу на эти ответы, как только закончим с отчетами, которые я должен представить: S –