我们需要获取有奖金的员工相关信息。要做的事情如下:
1. 确定总体问题
这道题目要求我们计算并返回有奖金的员工的详细信息,包括员工编号、名字、姓氏、奖金类型、当前薪水以及奖金金额。奖金金额根据奖金类型计算,具体为:类型1的奖金为薪水的10%,类型2的奖金为薪水的20%,其他类型为薪水的30%。
我们需要从员工表、奖金表和薪水表中提取数据,通过员工编号进行连接,并计算奖金金额。
2. 分析关键问题
- 连接表:将
employees
、emp_bonus
和salaries
表连接起来,以便获取每个员工的奖金和薪水信息。 - 筛选当前薪水:通过
to_date = '9999-01-01'
条件筛选出当前薪水记录。 - 计算奖金金额:根据奖金类型计算奖金金额。
- 排序输出:按员工编号升序排列输出结果。
3. 解决每个关键问题的代码及讲解
步骤1:连接表
我们使用INNER JOIN
将employees
、emp_bonus
和salaries
表连接起来:
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;