SQL添加新列

约翰·加尔特

我很乐意在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;

笔记:

  • 这是从一年的第一天开始的工资。您可以拥有任何特定日期的工资(例如De 31或7月1日)。
  • 如果员工在特定年份没有薪水,则值为NULL
  • GROUP BY子句具有所有未聚合的列。尽管如果这emp_no是主键,那么这并不是正式要求,但是如果您正在学习SQL,则这是一个好习惯。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章