- ~
題目描述
給出每一個員工每一年薪水漲幅超過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