美文网首页职场菜鸟成长记机器学习和人工智能入门
图解面试题:你有多久没涨过工资了?

图解面试题:你有多久没涨过工资了?

作者: 猴子数据分析 | 来源:发表于2020-05-22 17:39 被阅读0次

    【题目】

    “雇员表“中记录了员工的信息,“薪水表“中记录了对应员工发放的薪水。两表通过“雇员编号”关联。

    查找当前所有雇员入职以来的薪水涨幅,给出雇员编号以及其对应的薪水涨幅,并按照薪水涨幅进行升序。

    (注:薪水表中结束日期为2004-01-01的才是当前员工,否则是已离职员工)

    【解题思路】

    要求出当前所有雇员入职以来的薪水涨幅,薪水涨幅=当前薪水-入职薪水

    所以,需要知道雇员的入职薪水和当前薪水。

    当前薪水是“薪水表“中的“结束日期”=2004-01-01,这一行对应的薪水。

    入职薪水是“雇员表“中的“雇用日期”=“薪水表“中的“起始日期”,这一行对应的薪水。

    【解题步骤】

    1. 当前薪水

    当前薪水是“薪水表“中的“结束日期”=2004-01-01。从“薪水表“给的案例数据可以看出,“雇员编号”(10002)有两条薪水记录,说明他经历过一次涨薪。“雇员编号”(10005)的薪水“结束日期”不是2004-01-01,说明该员工已经离职。“雇员编号”(10006)有一条薪水记录,说明他没有经历过涨薪。

    select雇员编号,薪水as当前薪水from薪水表where结束日期 ='2004-01-01';

    2. 入职薪水

    入职薪水是“雇员表“中的“雇用日期”=“薪水表“中的“起始日期”。

    这涉及到两个表,因此需要用到多表联结,拿出《猴子 从零学会SQL》里面的多表联结图。

    使用哪种联结呢?

    因为题目要求的是“查找当前所有雇员”,所以用“雇员表”为左表,保留左表的全部数据,所以使用左联结。

    selecta.雇员编号,薪水as入职薪水from雇员表asaleftjoin薪水表asbona.雇员编号 = b.雇员编号wherea.雇用日期 = b.起始日期;

    因为雇员表中还包含了离职员工,而题目要求的是“当前所有雇员“,也就是在职员工,所以需要用where子句筛出在职的员工。也就是结束日期 = '2004-01-01'的员工编号:

    where a.雇员编号 in (select雇员编号from薪水表where结束日期 ='2004-01-01');

    将两表联结和where条件加入,完整的sql就是:

    selecta.雇员编号,薪水as入职薪水from雇员表asaleftjoin薪水表asbona.雇员编号 = b.雇员编号wherea.雇用日期 = b.起始日期anda.雇员编号in(select雇员编号from薪水表where结束日期 ='2004-01-01');

    3.薪水涨幅

    把步骤1的查找结果当做临时表m,把步骤2的查询结果当做临时表n。两表通过“雇员编号”进行多表联结。

    使用哪种联结呢?

    因为要保留左表(m)的全部数据(在职的全部雇员),所以使用左联结。

    selectm.雇员编号,当前薪水-入职薪水as薪水涨幅frommleftjoinnonm.雇员编号 = n.雇员编号;

    4.按薪水涨幅进行升序

    使用order by子句对查询结果排序。把表m和表n的sql代码代入,得到:

    selectm.雇员编号,当前薪水-入职薪水as薪水涨幅from(select雇员编号,薪水as当前薪水from薪水表where结束日期 ='2004-01-01')asmleftjoin(selecta.雇员编号,薪水as入职薪水from雇员表asaleftjoin薪水表asbona.雇员编号 = b.雇员编号wherea.雇用日期 = b.起始日期anda.雇员编号in(select雇员编号from薪水表where结束日期 ='2004-01-01'))asnonm.雇员编号 = n.雇员编号orderby薪水涨幅;

    【本题考点】

    1.考查理解业务的能力。知道如何将“薪水涨幅“指标定义为入职薪水-当前薪水。

    2.考查多表联结。需要知道什么情况下使用哪种联结。

    【举一反三】

    查找所有学生开学以来的成绩涨幅,给出学生编号以及其对应的成绩涨幅,并按照成绩涨幅进行升序。

     

    selectm.学生编号,当前成绩-入学成绩as成绩涨幅from(select学生编号,成绩as当前成绩from成绩表where结束日期 ='2011-10-02')asmleftjoin(selecta.学生编号,b.成绩as入学成绩from学生表asaleftjoin成绩表asbona.学生编号 = b.学生编号wherea.入学日期 = b.起始日期)asnonm.学生编号 = n.学生编号orderby成绩涨幅;

    推荐:如何从零学会sql?

    相关文章

      网友评论

        本文标题:图解面试题:你有多久没涨过工资了?

        本文链接:https://www.haomeiwen.com/subject/tmhcahtx.html