繁体   English   中英

Microsoft Access下的SQL查询语句

[英]Sql Query statement under microsoft access

我有2张桌子:

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

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

与一对多的关系

我想查询返回

[员工姓名]和

[总和(贷款)]和

[总和(折扣)]和

[sum(overTimeHours)]和

[count(attending)]参加人数= true,

[计数(出席)* SalaryPerDay]和

[sum(overTimeHours)* overTimeHoursPrice]和

[(计数(出席)* SalaryPerDay)+(总和(overTimeHours)*超时(Price)--(总和(折扣))-(总和(贷款))]

1-其中Date> = [date1]和Date <= [date2]

2-其中Date> = [date1] And Date <= [date2] And EmployeeName = [name]

(date1和date2和名称是参数)

这样的事情应该可以解决问题。

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() 与仅假设该字段包含10相比,这是一个更加可靠的解决方案。

编辑#2:我还应注意,语法根据您在哪里使用而略有不同。 上面是派生表(即INNER JOIN关键字后括号内的子查询)的“标准sql”语法。 如果通过ODBC连接运行此查询,则以上语法有效。

但是,如果您要尝试在Access本身中创建查询,则需要使用方括号后跟[ ].方括号[ ]. 而不是子查询中的括号( ) 所以代替:

SELECT ... FROM Employee emp INNER JOIN (SELECT ... ) sch ON ...

用这个:

SELECT ... FROM Employee emp INNER JOIN [SELECT ... ]. sch ON ...

我想你要:

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(如果未参加)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM