我们需要获取有奖金的员工相关信息。要做的事情如下:

1. 确定总体问题

这道题目要求我们计算并返回有奖金的员工的详细信息,包括员工编号、名字、姓氏、奖金类型、当前薪水以及奖金金额。奖金金额根据奖金类型计算,具体为:类型1的奖金为薪水的10%,类型2的奖金为薪水的20%,其他类型为薪水的30%。

我们需要从员工表、奖金表和薪水表中提取数据,通过员工编号进行连接,并计算奖金金额。

2. 分析关键问题

  • 连接表:将employeesemp_bonussalaries表连接起来,以便获取每个员工的奖金和薪水信息。
  • 筛选当前薪水:通过to_date = '9999-01-01'条件筛选出当前薪水记录。
  • 计算奖金金额:根据奖金类型计算奖金金额。
  • 排序输出:按员工编号升序排列输出结果。

3. 解决每个关键问题的代码及讲解

步骤1:连接表

我们使用INNER JOINemployeesemp_bonussalaries表连接起来:

from
    employees ey
    join emp_bonus eb on eb.emp_no = ey.emp_no
    join salaries s on ey.emp_no = s.emp_no
  • join emp_bonus eb on eb.emp_no = ey.emp_no:通过员工编号连接员工表和奖金表。
  • join salaries s on ey.emp_no = s.emp_no:通过员工编号连接员工表和薪水表。
步骤2:筛选当前薪水

我们通过to_date = '9999-01-01'条件筛选出当前薪水记录:

where
    to_date = '9999-01-01'
步骤3:计算奖金金额

我们使用CASE语句根据奖金类型计算奖金金额,类型1的奖金为薪水的10%,类型2的奖金为薪水的20%,其他类型为薪水的30%,并使用ROUND函数保留一位小数:

round(
    case
        when eb.btype = 1 then s.salary * 0.1
        when eb.btype = 2 then s.salary * 0.2
        else s.salary * 0.3
    end,
    1
) as bonus
步骤4:排序输出

我们使用ORDER BY按员工编号升序排列输出结果:

order by
    emp_no asc

完整代码

select
    ey.emp_no,
    ey.first_name,
    ey.last_name,
    eb.btype,
    s.salary,
    round(
        case
            when eb.btype = 1 then s.salary * 0.1
            when eb.btype = 2 then s.salary * 0.2
            else s.salary * 0.3
        end,
        1
    ) as bonus
from
    employees ey
    join emp_bonus eb on eb.emp_no = ey.emp_no
    join salaries s on ey.emp_no = s.emp_no
where
    to_date = '9999-01-01'
order by
    emp_no asc;