我很乐意在StackOverflow上问我的第一个问题。
我的数据库(员工)中有两个表(员工和薪水)。
员工表如下所示:
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no | int | NO | PRI | NULL | |
| first_name | varchar(14) | NO | | NULL | |
| last_name | varchar(16) | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+
薪水表如下所示:
+-----------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+------+------+-----+---------+-------+
| emp_no | int | NO | PRI | NULL | |
| salary | int | NO | | NULL | |
| from_date | date | NO | PRI | NULL | |
| to_date | date | NO | | NULL | |
+-----------+------+------+-----+---------+-------+
我想返回特定日期间隔的值。例如,我想动态地了解员工在一段时间内的工资水平,在1991-1992年期间的1990-1991年间的工资水平,等等。
我写了以下查询:
SELECT
e.emp_no,
e.first_name,
e.last_name,
s.salary AS Salary_for_1990
FROM
employees e
JOIN
salaries s ON e.emp_no = s.emp_no
WHERE
from_date BETWEEN '1990-01-01' AND '1990-12-31'
GROUP BY e.emp_no
ORDER BY e.emp_no ASC
LIMIT 10;
我得到以下结果:
+--------+------------+-----------+-----------------+
| emp_no | first_name | last_name | Salary_for_1990 |
+--------+------------+-----------+-----------------+
| 10001 | Georgi | Facello | 66961 |
| 10004 | Christian | Koblick | 48271 |
| 10005 | Kyoichi | Maliniak | 82621 |
| 10006 | Anneke | Preusig | 40000 |
| 10007 | Tzvetan | Zielinski | 60740 |
| 10009 | Sumant | Peace | 70889 |
| 10011 | Mary | Sluis | 42365 |
| 10013 | Eberhardt | Terkki | 46305 |
| 10018 | Kazuhide | Peha | 61648 |
| 10021 | Ramzi | Erde | 59700 |
+--------+------------+-----------+-----------------+
因此,它适用于单个值“ 1990-1991”年,但是,我寻求一种可能性在查询中添加“ 1991-1992”,“ 1992-1993”年等附加列,以便能够看到动态员工工资的增长。
我考虑过变量,但是我不知道如何在上下文中查询变量。
期待您的回答。
先感谢您。
人们的薪水截至日期,而不是日期范围。
对于您的问题,可以使用条件聚合:
SELECT e.emp_no, e.first_name, e.last_name,
MAX(CASE WHEN from_date <= '1990-01-01' AND to_date > '1990-01-01' THEN salary END) as salary_19900101,
MAX(CASE WHEN from_date <= '1991-01-01' AND to_date > '1991-01-01' THEN salary END) as salary_19910101,
MAX(CASE WHEN from_date <= '1992-01-01' AND to_date > '1991-02-01' THEN salary END) as salary_19910101
FROM employees e JOIN
salaries s
ON e.emp_no = s.emp_no
GROUP BY e.emp_no, e.first_name, e.last_name
ORDER BY e.emp_no ASC
LIMIT 10;
笔记:
NULL
。GROUP BY
子句具有所有未聚合的列。尽管如果这emp_no
是主键,那么这并不是正式要求,但是如果您正在学习SQL,则这是一个好习惯。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句