php - 对不同表上的列求和并乘以另一个表上的列的值

标签 php mysql

我需要根据参加的 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/

相关文章:

PHPExcel 功能问题

php - 需要使用 str_replace 或任何其他方式翻译字符串中的单词

php - MySQL - 基于另一个查询的查询

php - mysqli数组到子查询中的mysql?

mysql - 如何为 JBoss 7 数据源配置 MySQL ReplicationDriver?

php - Laravel 查询生成器一般错误 2031

php - 在 PHPMyAdmin 中收到 MySQL 错误

php - 从 jquery 中的对象获取结果

php - 使用 PHP 将数字舍入到最接近的 0.2

php - 在非对象上调用成员函数bind_param()?那我该怎么办?