首页 > 试题广场 >

人力行政

[编程题]人力行政
  • 热度指数:56 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

表: 雇员表

+----------+--------------+
|  字段名称 | 类型         | 
+----------+--------------+
| 雇员编号  | int          |
| 出生日期  | date(255)    | 
| 名       | varchar(512) |
| 姓       | varchar(512) | 
| 性别     | varchar(512) |
| 雇用日期  | date(255)    |
+----------+--------------+
雇员编号 是该表的主键。
该表的每一行表示 每一个员工的信息,包含员工的姓名、雇用日期、性别、年龄等信息。

表: 雇员奖金表

+----------+--------------+
|  字段名称 | 类型         | 
+----------+--------------+
| 雇员编号  | int          |
| 接收日期  | date(255)    | 
| 奖金类型  | varchar(512) |
+----------+--------------+
雇员编号 是该表的主键。
雇员编号 是 “雇员表” 表中 雇员编号 的外键。
该表的每一行表示 给员工发放奖金的记录,包含员工编号、接收奖金日期、奖金类型。

奖金类型的值是
1,表示奖金金额为薪水的 10%。 
2,表示奖金金额为薪水的 20%。
3,表示奖金金额为薪水的 30%。

表: 薪水表

+-------------+--------------+
| 字段名称     | 类型         |
+-------------+--------------+
| 雇员编号     | INT          |   
| 薪水         | INT          |
| 起始日期     | date(255)    | 
| 结束日期     | date(255)    | 
+-------------+--------------+

雇员编号 是该表的主键。 
雇员编号 是“雇员奖金表” 、 “雇员表” 表中 雇员编号 的外键。
该表的每一行表示员工发放薪水相关的信息,包含雇员编号、薪水、起始日期、结束日期。
结束日期 ='9999-01-01' 的数据表示是员工当前薪水。

 

编写一个SQL查询,查询查找雇员编号、名、姓、奖金类型、对应的当前薪水及奖金金额。

查询结果如下例所示。

 

示例 1:

输入: 表:雇员表
+-------+-----------+-----------+-----------+----+-------------+
| 雇员编号  | 出生日期      | 名         | 姓         | 性别 | 雇用日期        |
+-------+-----------+-----------+-----------+----+-------------+
| 10001 | 1953/9/2  | Georgi    | Facello   | M  | 1986/6/26   |
| 10002 | 1964/6/2  | Bezalel   | Simmel    | F  | 1985/11/21  |
| 10003 | 1959/12/3 | Parto     | Bamford   | M  | 1986/8/28   |
| 10004 | 1954/5/1  | Chirstian | Koblick   | M  | 1986/12/1   |
| 10005 | 1955/1/21 | Kyoichi   | Maliniak  | M  | 1989/9/12   |
| 10006 | 1953/4/20 | Anneke    | Preusig   | F  | 1989/6/2    |
| 10007 | 1957/5/23 | Tzvetan   | Zielinski | F  | 1989/2/10   |
| 10008 | 1958/2/19 | Saniya    | Kalloufi  | M  | 1994/9/15   |
| 10009 | 1952/4/19 | Sumant    | Peac      | F  | 1985/2/18   |
| 10010 | 1963/6/1  | Duangkaew | Piveteau  | F  | 1989/8/24   |
| 10011 | 1953/11/7 | Mary      | Sluis     | F  | 1990/1/22   |
+-------+-----------+-----------+-----------+----+-------------+

表:雇员奖金表
+-------+-----------+-------+
| 雇员编号  | 接收日期      | 奖金类型  |
+-------+-----------+-------+
| 10001 | 2010/1/1  | 1     |
| 10002 | 2010/10/1 | 2     |
| 10003 | 2011/12/3 | 3     |
| 10004 | 2010/1/1  | 1     |
+-------+-----------+-------+

表:薪水表
+-------+-------+-----------+------------+
| 雇员编号  | 薪水    | 起始日期      | 结束日期       |
+-------+-------+-----------+------------+
| 10001 | 60117 | 1986/6/26 | 1987/6/26  |
| 10001 | 62102 | 1987/6/26 | 1988/6/25  |
| 10001 | 66074 | 1988/6/25 | 1989/6/25  |
| 10001 | 66596 | 1989/6/25 | 1990/6/25  |
| 10001 | 66961 | 1990/6/25 | 1991/6/25  |
| 10001 | 71046 | 1991/6/25 | 1992/6/24  |
| 10001 | 74333 | 1992/6/24 | 1993/6/24  |
| 10001 | 75286 | 1993/6/24 | 1994/6/24  |
| 10001 | 75994 | 1994/6/24 | 1995/6/24  |
| 10001 | 76884 | 1995/6/24 | 1996/6/23  |
| 10001 | 80013 | 1996/6/23 | 1997/6/23  |
| 10001 | 81025 | 1997/6/23 | 1998/6/23  |
| 10001 | 81097 | 1998/6/23 | 1999/6/23  |
| 10001 | 84917 | 1999/6/23 | 2000/6/22  |
| 10001 | 85112 | 2000/6/22 | 2001/6/22  |
| 10001 | 85097 | 2001/6/22 | 2002/6/22  |
| 10001 | 88958 | 2002/6/22 | 9999/1/1   |
| 10002 | 72527 | 1996/8/3  | 1997/8/3   |
| 10002 | 72527 | 1997/8/3  | 1998/8/3   |
+-------+-------+-----------+------------+ 输出: +-----------+---------+--------+---------+---------+
| 雇员编号   |   名    |   姓   | 奖金类型 |   薪水   |
+-----------+---------+--------+---------+---------+
|  10001    | Georgi  |Facello |  1      |  88958  |
+-----------+---------+--------+---------+---------+
示例1

输入

CREATE TABLE 雇员表
(
    雇员编号 INT,
    出生日期 DATE,
    名 VARCHAR(512),
    姓 VARCHAR(512),
    性别 VARCHAR(512),
    雇用日期 DATE
);


CREATE TABLE 雇员奖金表
(
    雇员编号 INT,
    接收日期 VARCHAR(512),
    奖金类型 VARCHAR(512) -- 注意这里的改动,将 DATE 改为 VARCHAR
);



CREATE TABLE 薪水表
(
    雇员编号 INT,
    薪水 INT,
    起始日期 DATE,
    结束日期 DATE
);

INSERT INTO 雇员表 (雇员编号, 出生日期, 名, 姓, 性别, 雇用日期) VALUES
(10001, '1953-09-02', 'Georgi', 'Facello', 'M', '1986-06-26'),
(10002, '1964-06-02', 'Bezalel', 'Simmel', 'F', '1985-11-21'),
(10003, '1959-12-03', 'Parto', 'Bamford', 'M', '1986-08-28'),
(10004, '1954-05-01', 'Chirstian', 'Koblick', 'M', '1986-12-01'),
(10005, '1955-01-21', 'Kyoichi', 'Maliniak', 'M', '1989-09-12'),
(10006, '1953-04-20', 'Anneke', 'Preusig', 'F', '1989-06-02'),
(10007, '1957-05-23', 'Tzvetan', 'Zielinski', 'F', '1989-02-10'),
(10008, '1958-02-19', 'Saniya', 'Kalloufi', 'M', '1994-09-15'),
(10009, '1952-04-19', 'Sumant', 'Peac', 'F', '1985-02-18'),
(10010, '1963-06-01', 'Duangkaew', 'Piveteau', 'F', '1989-08-24'),
(10011, '1953-11-07', 'Mary', 'Sluis', 'F', '1990-01-22');
INSERT INTO 雇员奖金表 (雇员编号, 接收日期, 奖金类型) VALUES
(10001, '2010-01-01', '1'),
(10002, '2010-10-01', '2'),
(10003, '2011-12-03', '3'),
(10004, '2010-01-01', '1');
INSERT INTO 薪水表 (雇员编号, 薪水, 起始日期, 结束日期) VALUES
(10001, 60117, '1986-06-26', '1987-06-26'),
(10001, 62102, '1987-06-26', '1988-06-25'),
(10001, 66074, '1988-06-25', '1989-06-25'),
(10001, 66596, '1989-06-25', '1990-06-25'),
(10001, 66961, '1990-06-25', '1991-06-25'),
(10001, 71046, '1991-06-25', '1992-06-24'),
(10001, 74333, '1992-06-24', '1993-06-24'),
(10001, 75286, '1993-06-24', '1994-06-24'),
(10001, 75994, '1994-06-24', '1995-06-24'),
(10001, 76884, '1995-06-24', '1996-06-23'),
(10001, 80013, '1996-06-23', '1997-06-23'),
(10001, 81025, '1997-06-23', '1998-06-23'),
(10001, 81097, '1998-06-23', '1999-06-23'),
(10001, 84917, '1999-06-23', '2000-06-22'),
(10001, 85112, '2000-06-22', '2001-06-22'),
(10001, 85097, '2001-06-22', '2002-06-22'),
(10001, 88958, '2002-06-22', '9999-01-01'),
(10002, 72527, '1996-08-03', '1997-08-03'),
(10002, 72527, '1997-08-03', '1998-08-03');

输出

雇员编号|名|姓|奖金类型|薪水
10001|Georgi|Facello|1|88958
头像 牛客987852806号
发表于 2024-07-01 14:55:33
简单三表链接 select g.雇员编号, g.名, g.姓, j.奖金类型, x.薪水 from 雇员表 g left join 雇员奖金表 j on g.雇员编号=j.雇员编号 left join 薪水表 x on x.雇员编号=j.雇员编号 where 结束日期="9999-01 展开全文
头像 最爱青草蛋糕
发表于 2025-10-30 08:44:19
select 雇员编号,名,姓,奖金类型,薪水 from 雇员表 left join 雇员奖金表 using(雇员编号) left join 薪水表 using(雇员编号) where 结束日期 ='9999-01-01'