SQL21查找在职员工自入职以来的薪水涨幅情况

2023-10-11 02:48

本文主要是介绍SQL21查找在职员工自入职以来的薪水涨幅情况,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 题目
  • 2. 题解
  • 反思:一个原始字段如何创造出多个字段

题目较难,纳入错题本。
如果思路不正确,就会无从下手。

1. 题目

  • 题目来源:查找在职员工自入职以来的薪水涨幅情况

  • 题目描述

  • 表格
    在这里插入图片描述在这里插入图片描述

  • 所需结果
    在这里插入图片描述

2. 题解

薪资涨幅 = 当前工资 - 入职工资

当前工资 :to_date = '9999-01-01'
入职工资:hire_date

问题是如何构造出这两个字段(没思路就卡这里了)

分别从两张表中利用这个信息,然后让两张表分别与工资表进行连接,最后正在外表中求取两者差值。
(因为被日期限制死了,所以不需要分组或者DISTINCT进行去重)

简单来说,连接过程就是 (A-B) - (B - C),这里B代表salaries表格,用了两次。

(其实后面用 A-B-C的方式和更加简单,一次JOIN 就增加了一个字段

完整过程如下:

在这里插入代码片# # 入职工资
# SELECT s.emp_no, s.salary
# FROM salaries s
# JOIN employees e 
# ON s.emp_no = e.emp_no AND e.hire_date = s.from_date# # 当前工资
# SELECT s.emp_no, s.salary
# FROM salaries s
# JOIN employees e 
# ON s.emp_no = e.emp_no AND s.to_date = '9999-01-01'SELECT min_salary.emp_no, max_salary.salary - min_salary.salary growth
FROM(SELECT s.emp_no, s.salaryFROM salaries sJOIN employees e ON s.emp_no = e.emp_no AND e.hire_date = s.from_date  ) min_salary
JOIN (
SELECT s.emp_no, s.salary
FROM salaries s
JOIN employees e 
ON s.emp_no = e.emp_no AND s.to_date = '9999-01-01') max_salary
ON min_salary.emp_no = max_salary.emp_no
ORDER BY growth ASC

一种更为简单,也更可取的方法:

直接 使用的 A-B-C连接方法!

# 方法1:一步到位SELECT e.emp_no, (a.salary - b.salary) AS growth
FROM employees eJOIN salaries a ON e.emp_no = a.emp_no AND a.to_date = '9999-01-01'JOIN salaries b ON e.emp_no = b.emp_no AND b.from_date = e.hire_date
ORDER BY growth ASC;# # 方法2:朴素做法# # 分别构造出 包含 employee 对应 last_salary、employee 对应 first_salary 的这两张表,最后利用employee 进行内连接# SELECT a.emp_no, (a.salary - b.salary) AS growth
# FROM (SELECT e.emp_no, s.salary FROM employees e JOIN salaries s ON e.emp_no = s.emp_no WHERE to_date = '9999-01-01') AS a
#     JOIN (SELECT e.emp_no, s.salary FROM employees e JOIN salaries s ON e.emp_no = s.emp_no WHERE from_date = e.hire_date) AS b
#     ON a.emp_no = b.emp_no
# ORDER BY growth

注:因为是 INNER JOIN ,所以 a.to_date = '9999-01-01'b.from_date = e.hire_date是可以放在 ON 后面(而不一定需要WHERE)进行限制的。

反思:一个原始字段如何创造出多个字段

开始思路被阻断在 如何 利用 salary 这个字段创造出两个不同的字段,
毕竟使用行过滤一次也只能找出一个 对应的 salary,可是问题的求解需要 新(当前salary) 、 **旧(初始salary)**两个字段。
解决办法只有一个,多次使用JOIN,使用ON 进行不同的条件限制,就能找出相应的条件下的 salary

这篇关于SQL21查找在职员工自入职以来的薪水涨幅情况的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/184966

相关文章

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

如何保证android程序进程不到万不得已的情况下,不会被结束

最近,做一个调用系统自带相机的那么一个功能,遇到的坑,在此记录一下。 设备:红米note4 问题起因 因为自定义的相机,很难满足客户的所有需要,比如:自拍杆的支持,优化方面等等。这些方面自定义的相机都不比系统自带的好,因为有些系统都是商家定制的,难免会出现一个奇葩的问题。比如:你在这款手机上运行,无任何问题,然而你换一款手机后,问题就出现了。 比如:小米的红米系列,你启用系统自带拍照功能后

Win8下如何快速查找和删除电脑中的病毒

Win8系统如何查找和删除病毒?检查你的电脑是否存在病毒的一种快速方法是使用 Windows Defender. 此恶意软件防护随 Windows 提供,可帮助识别和删除病毒、间谍软件和其他恶意软件。   注意:如果你使用的是 Windows RT,则 Windows Defender 会始终启用,并且不能关闭。   如果你使用的是 Windows 8,则可以根据自己的喜好运行由其他

Windows11电脑上自带的画图软件修改照片大小(不裁剪尺寸的情况下)

针对一张图片,有时候上传的图片有大小限制,那么在这种情况下如何修改其大小呢,在不裁剪尺寸的情况下 步骤如下: 1.选定一张图片,右击->打开方式->画图,如下: 第二步:打开图片后,我们可以看到图片的大小为82.1kb,点击上面工具栏的“重设大小和倾斜”进行调整,如下: 第三步:修改水平和垂直的数字,此处我修改为分别都修改为50,然后保存,可以看到大小变成63.5kb,如下:

nyoj 685 查找字符串

当初一开始没做出来。 后来,学习过一段时间之后,在返回来做这道题,忽然发现,map类容器可以做。 PS:需要注意的是:此题如果用c++的输入输出的话,会超时。 O(time):gets()<  scanf() < cin。   附上代码: #include<stdio.h>#include<map>#include<string>#include<string.h>usin

【C++二分查找】2439. 最小化数组中的最大值

本文涉及的基础知识点 C++二分查找 LeetCode2439. 最小化数组中的最大值 给你一个下标从 0 开始的数组 nums ,它含有 n 个非负整数。 每一步操作中,你需要: 选择一个满足 1 <= i < n 的整数 i ,且 nums[i] > 0 。 将 nums[i] 减 1 。 将 nums[i - 1] 加 1 。 你可以对数组执行 任意 次上述操作,请你返回可以得到的 n

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序

notepad++ 正则表达式多条件查找替换

基础语法参考: https://www.cnblogs.com/winstonet/p/10635043.html https://www.linuxidc.com/Linux/2019-05/158701.htm   通常情况下我们查找的内容和要被替换掉的内容是一样的,我们只需要使用正则表达式精确框定查找内容,替换直接输入要替换的内容即可。 但有时会比较复杂,查找的内容,只需要替换其中

postgres数据库中如何看查询是否走索引,以及在什么情况下走索引

在 PostgreSQL 中,可以通过 EXPLAIN 或 EXPLAIN ANALYZE 查看查询计划,以判断查询是否使用了索引。除此之外,了解索引的使用条件对于优化查询性能也很重要。 1. 如何查看查询是否使用索引 使用 EXPLAIN 查看查询计划 EXPLAIN 显示 PostgreSQL 如何执行查询,包括是否使用索引。 EXPLAIN SELECT * FROM users WH

【中等】保研/考研408机试-二分查找(模板题)

二分查找就是在一个有序数组中查找某个值,以首端尾端的中点mid查找对比,mid与要查找的数进行对比,看落在哪个区间,在那个区间重新得到首端和尾端,进而得到新的mid值。 一、模板题 二分查找-I_牛客题霸_牛客网 class Solution {public:int search(vector<int>& nums, int target) {int left=0,right=nums.s