NiukeデータベースSQL実際の戦闘06-従業員が仕事に参加したときにすべての従業員の給与を見つける

NiukeデータベースSQL実際の戦闘06-従業員が仕事に参加したときにすべての従業員の給与を見つける

タイトルの説明

雇用時の全従業員の給与を見つけ、emp_noとsalaryを与え、emp_noに従って順序を逆にします

CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));

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`));

説明を入力してください:

なし

出力の説明:

emp_no 給料
10011 25828
省略 省略
10001 60117

私の答え

select e.emp_no,s.salary
from employees e
left join salaries s
on e.emp_no = s.emp_no and e.hire_date = s.from_date
order by e.emp_no desc 

この質問は、次の4つの知識ポイントに注意を払う必要があります。

  1. テストデータでは、salaries.emp_noは一意ではありません(従業員emp_no ***の従業員には複数の昇給がある可能性があるため、salariesに対応するレコードが複数あるため)、employees.emp_noは一意、つまりより多くの給与になります従業員の場合、給与表のemployees.emp_noの対応するレコードsalaries.emp_noを検索する必要があります。制限はe.emp_no = s.emp_noです。
  2. タイトルによると、salaries.from_dateとemployees.hire_dateの値は等しいはずなので、制限がありますe.hire_date = s.from_date
  3. 質問の意味に従って、それはemp_no値の逆順で配置する必要があるため、ORDER BY e.emp_no DESCを最後に追加する必要があります
  4. コードを読みやすくするために、エイリアスエイリアスステートメントを使用して、従業員をeに、給与をsに、つまりASを省略できる従業員AS eと給与ASを簡素化

最良の答えだと思います

従業員テーブルはまったく必要ありません。

select emp_no, salary from salaries
group by emp_no
having from_date = min(from_date)
order by emp_no desc
元の記事を136件公開 58のように 360,000以上を訪問

おすすめ

転載: blog.csdn.net/sunbocong/article/details/105480231