我需要总结与具有有效日期的引用文献相关的数据。
让我们想象一下这些表的薪水模式
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
想法是使用 s1
和 s2
的组合来查找最后日期:s1
是在工作日,而 s2
是 NULL
只有当没有以后的工资定义也适用时。
关于MySQL - 加入有效日期数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13762256/