MySQL - 加入有效日期数据

标签 mysql join

我需要总结与具有有效日期的引用文献相关的数据。

让我们想象一下这些表的薪水模式

employee                                         work
+----+------+                                    +----+--------+------------+
| id | name |                                    | id | emp_id | date       |
+----+------+                                    +----+--------+------------+
|  1 | John |                                    |  1 |      1 | 2012-10-05 |
|  2 | Bob  |                                    |  2 |      1 | 2012-02-10 |
+----+------+                                    |  3 |      2 | 2012-09-03 |
                                                 |  4 |      1 | 2012-12-12 |
salary                                           |  5 |      1 | 2012-04-04 |
+----+--------+--------------+------------+      |  6 |      2 | 2012-06-09 |
| id | emp_id | daily_amount | start_date |      |  7 |      1 | 2012-07-24 |
+----+--------+--------------+------------+      +----+--------+------------+
|  1 |      1 |           10 | 2012-01-01 | 
|  2 |      1 |           15 | 2012-04-16 |
|  3 |      2 |           20 | 2012-05-25 |
+----+--------+--------------+------------+

从 2012 年 1 月 1 日开始,John 每天支付 10 美元,然后从 2012 年 4 月 16 日起,他的工资增加到 15 美元。
Bob 自 2012-05-25 以来已支付 20


现在假设我需要计算两名员工在 2012 年的薪水。 这是我天真的尝试:

SELECT
  emp.name AS "employee"
, SUM(sal.daily_amount) AS "amount"
FROM employee AS emp
JOIN work AS wrk ON (wrk.emp_id = emp.id)
JOIN salary AS sal ON (
  sal.emp_id = emp.id
  AND wrk.date >= sal.start_date
)
WHERE YEAR(wrk.date) = 2012
GROUP BY emp.id
;

当然它不会给我我想要的,因为它没有采用 MAX start_date

问题:Bob & John 在 2012 年的收入是多少?

最佳答案

SQLfiddle 上测试了以下内容:

SELECT employee.name AS "employee",
       SUM(s1.daily_amount) AS "amount"
FROM work
  INNER JOIN salary s1
     ON work.emp_id = s1.emp_id
    AND work.date >= s1.start_date
  LEFT JOIN salary s2
     ON work.emp_id = s2.emp_id
    AND work.date >= s2.start_date
    AND s2.start_date > s1.start_date
  INNER JOIN employee
     ON work.emp_id = employee.id
WHERE s2.emp_id IS NULL
GROUP BY work.emp_id

想法是使用 s1s2 的组合来查找最后日期:s1 是在工作日,而 s2NULL 只有当没有以后的工资定义也适用时。

关于MySQL - 加入有效日期数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13762256/

相关文章:

php - 为什么我不应该在 PHP 中使用 mysql_* 函数?

mysql - 如何避免MySQL更新中相关子查询分配中的多列

MySQL 允许选择既不是聚合列也不是在 group by 中指定的列。可以禁用此行为吗?

mysql - 如何有效地将大量数据存储在DB中?

mysql - SQLSTATE 错误语法错误或访问冲突 : 1066 Not unique table/alias: 'users_sessions'

mySQL 自连接表以在今天的日期从 max(column) 中查找单行

Mysql自定义order by和group by

r - 查找出现在一个表中但不在第二个表中的行号

python - 加入一组产生 Python 迭代器的有序整数

MySQL 使用多个表连接父记录