![](/img/trans.png)
[英]SQL query (using microsoft access) using “Like” statement doesnt work
[英]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()
。 与仅假设该字段包含1
或0
相比,这是一个更加可靠的解决方案。
编辑#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.