Sql Query оператор под Microsoft Access - PullRequest
0 голосов
/ 29 сентября 2011

у меня есть 2 таблицы:

Employee:
    ID
    SalaryPerDay
    overTimeHoursPrice
    .....
    .....

Schedule:
    ID
    EmployeeID
    Date
    Attending  (boolean)
    loan
    discount
    overTimeHours

со многими к одному отношению

Я хочу, чтобы запрос вернул

[имя сотрудника] и

[сумма (заем)] и

[сумма (скидка)] и

[сумма (overTimeHours)] и

[количество (посещение)], где посещение = истина и

[количество (посещение) * SalaryPerDay] и

[сумма (overTimeHours) * overTimeHoursPrice] и

[(количество (посещение) * SalaryPerDay) + (сумма (overTimeHours) * overTimeHoursPrice) - (сумма (скидка)) - (сумма (ссуда))]

1-, где Дата> = [дата1] И Дата <= [дата2] </p>

2 - где Дата> = [дата1] И Дата <= [дата2] И Имя сотрудника = [имя] </p>

(date1 и date2 и name являются параметрами)

Ответы [ 2 ]

0 голосов
/ 29 сентября 2011

Я думаю, что вы хотите:

SELECT e.EmployeeName, 
   Sum(s.loan) AS SumOfloan, 
   Sum(s.discount) AS SumOfdiscount, 
   Sum(s.overTimeHours) AS SumOfoverTimeHours, 
   Sum(Abs([Attending])) AS Attnd, 
   Sum([SalaryPerDay]*Abs([Attending])) AS SalyAttnd, 
   Sum([overTimeHoursPrice]*[overtimehours]) AS OTCost, 
   Sum(([SalaryPerDay]*Abs([Attending])+[overTimeHoursPrice]*[overtimehours])-([loan]-[discount])) AS Due
FROM Employee e
INNER JOIN Schedule s ON e.ID = s.EmployeeID
WHERE s.Date Between [date1] And [Date2]
AND EmployeeName = [Name] 
GROUP BY e.ID, e.EmployeeName

Обратите внимание, что логическое значение равно 0 или -1, поэтому [SalaryPerDay] * Abs ([Attending] = Salary * 1, если посещают, или 0, если не посещают.

0 голосов
/ 29 сентября 2011

Нечто подобное должно сработать ....

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 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...