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

相关文章

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

宝塔安装的MySQL无法连接的情况及解决方案

《宝塔安装的MySQL无法连接的情况及解决方案》宝塔面板是一款流行的服务器管理工具,其中集成的MySQL数据库有时会出现连接问题,本文详细介绍两种最常见的MySQL连接错误:“1130-Hostisn... 目录一、错误 1130:Host ‘xxx.xxx.xxx.xxx’ is not allowed

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

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