Нечто подобное должно сработать ....
SELECT
emp.EmployeeName, sum_loan, sum_discount, sum_overTimeHours, count_attending,
(count_attending*SalaryPerDay) as totalDayPay,
(sum_overTimeHours*overTimeHoursPrice) as totalOverTimePay,
((count_attending*SalaryPerDay) + (sum_overTimeHours*overTimeHoursPrice) -
sum_discount - sum_loan) as grandTotal
FROM Employee emp
INNER JOIN (SELECT
EmployeeID,
sum(loan) as sum_loan,
sum(discount) as sum_discount,
sum(overTimeHours) as sum_overTimeHours,
sum(iif(Attending,1,0)) as count_attending
FROM Schedule
WHERE Date >= {date1} and Date <= {date2}
GROUP BY EmployeeID
) sch
ON emp.ID = sch.EmployeeID
WHERE emp.EmployeeName = {name}
Обратите внимание на два пункта WHERE
. Вы можете настроить их по мере необходимости для достижения двух различных параметризованных ограничений.
Редактировать № 1:
Из-за некоторой неопределенности относительно фактического числового значения «логического значения», хранящегося в поле Schedule.Attending
, я скорректировал приведенный выше запрос для явного учета логического значения. Для этого я использовал функцию выражения, специфичную для MSAccess, IIF()
. Это гораздо более надежное решение, чем просто предположить, что поле будет содержать либо 1
, либо 0
.
Правка № 2:
Следует также отметить, что синтаксис немного меняется в зависимости от того, где вы его используете. Выше приведен синтаксис «стандартный sql» для производной таблицы (это подзапрос, который находится внутри скобок после ключевых слов INNER JOIN
). Если вы выполняете этот запрос через соединение ODBC, приведенный выше синтаксис действителен.
Однако, если вы пытаетесь создать Запрос в самом Access, вам нужно использовать квадратные скобки с завершающим периодом [ ].
вместо круглых скобок ( )
вокруг подзапроса. Так что вместо:
SELECT ... FROM Employee emp INNER JOIN (SELECT ... ) sch ON ...
используйте это:
SELECT ... FROM Employee emp INNER JOIN [SELECT ... ]. sch ON ...