【366天】我愛刷題系列125(2018.02.06)

叨叨兩句

  1. ~

SQL習題020

1

題目描述
給出每一個員工每一年薪水漲幅超過5000的員工編號emp_no、薪水變動開始日期from_date以及薪水漲幅值salary_growth,並按照salary_growth逆序排列。
提示:在sqlite中獲取datetime時間對應的年份函數爲strftime('%Y', to_date)sql

CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));
函數

本題的難點在於如何理解 每一年薪水漲幅,以及複用salaries表求出每一年薪水漲幅超過5000的員工,具體思路以下:
一、假設s1是漲薪水前的表,s2是漲薪水後的表,由於每一個員工漲薪水的時間不全固定,有可能一年漲兩次,有可能兩年漲一次,因此每一年薪水的漲幅,應該理解爲兩條薪水記錄的from_date相同或to_date相同。
/** 若是隻限定to_date相同,則將第三條原始測試數據的52668改爲62668時,就會少一條【62668-48584=14084】的記錄
INSERT INTO salaries VALUES(10008,46671,'1998-03-11','1999-03-11');
INSERT INTO salaries VALUES(10008,48584,'1999-03-11','2000-03-10');
INSERT INTO salaries VALUES(10008, 62668 ,'2000-03-10','2000-07-31');  **/
二、找到s1與s2符合要求的記錄後,用s2的薪水減去s1的薪水,用salary_growth表示,加上限定條件 s1.emp_no = s2.emp_no AND salary_growth > 5000,即同一員工每一年漲幅超過5000的記錄
三、最後依次輸出emp_no、from_date、salary_growth,並以salary_growth逆序排列

SELECT s2.emp_no, s2.from_date, (s2.salary - s1.salary) AS salary_growth
FROM salaries AS s1, salaries AS s2
WHERE s1.emp_no = s2.emp_no 
AND salary_growth > 5000
AND (strftime("%Y",s2.to_date) - strftime("%Y",s1.to_date) = 1 
     OR strftime("%Y",s2.from_date) - strftime("%Y",s1.from_date) = 1 )
ORDER BY salary_growth DESC
相關文章
相關標籤/搜索