我需要根据参加的 session 、扣除额和发放的奖金来计算员工的月薪; 员工根据其职位的不同,每次 session 的薪酬也不同。
解决办法是: 工资=(每分钟工资* session 参加人数)+奖金-扣除额;
我有四张 table :
职位: ID、职位、pay_per_meeting
员工: ID、姓名、job_id
奖金: ID、金额、员工 ID、日期
扣除额: ID、金额、employee_id、日期
session : ID、employee_id、日期
SELECT
COUNT(meetings.employee_id) as meetings_attended,
COUNT(deductions.amount) as debt,
COUNT(bonuses.amount) bonus,
(SELECT jobs.pay_per_attendance from jobs where jobs.id = (select job_id from employees where id=meetings.employee_id)) as pay,
((meetings_attended * pay) + bonus - debt) as salary
FROM meetings
JOIN deductions ON deductions.employee_id = meetings.employee_id
JOIN bonuses ON bonuses.employee_id = meetings.employee_id
WHERE meetings.employee_id = 1
GROUP BY MONTH(meetings.date), MONTH(deductions.date), MONTH(bonuses.date)
每当我删除工资行时,上述查询都会返回许多不正确的值,但会给出未知列工资、meetings_attended、债务和奖金的错误,我确信分组有问题,但我不能只看到它。
最佳答案
您无法在定义的同一选择列表中引用列别名,您需要引用基础列。并且子查询无法访问主查询中计算的聚合。您需要重复聚合表达式,或者将所有内容移动到子查询中并在外部查询中使用它进行计算。
还有,你所有的COUNT()
表达式将返回相同的结果,因为它们只是计算行数(我假设没有一个值可以是 NULL
)。您可能想要COUNT(DISTINCT <column>)
要获得不同的计数,您需要使用唯一的列,因此它们应该是主键列,例如COUNT(DISTINCT deductions.id)
.
另一个问题是,当您在有多个联接时尝试对值进行求和和计数时,最终会得到过高的结果,因为行在所有表的叉积中出现重复。请参阅Join tables with SUM issue in MYSQL 。解决方案是计算子查询中每个表的总和。
SELECT m.month, m.meetings_attended, d.debt, b.bonus,
m.meetings_attended * j.pay_per_meeting + b.amount - d.amount AS salary
FROM (
SELECT MONTH(date) AS month, COUNT(*) AS meetings_attended
FROM meetings
WHERE employee_id = 1
GROUP BY month) AS m
JOIN (
SELECT MONTH(date) AS month, COUNT(*) AS bonus, SUM(amount) AS amount
FROM bonuses
WHERE employee_id = 1
GROUP BY month) AS b ON m.month = b.month
JOIN (
SELECT MONTH(date) AS month, COUNT(*) AS debt, SUM(amount) AS amount
FROM deductions
WHERE employee_id = 1
GROUP BY month) AS d ON m.month = d.month
CROSS JOIN employees AS e
JOIN jobs AS j ON j.id = e.job_id
WHERE e.employee_id = 1
关于php - 对不同表上的列求和并乘以另一个表上的列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49826222/