MySQL工资管理系统

前言:
工资管理系统是一个用于记录员工薪资信息、计算薪资、管理薪资发放等功能的系统。该系统旨在帮助企业高效、准确地处理员工的薪资数据,并提供方便的查询和报表功能。
系统的主要功能包括:员工信息管理:记录员工的基本信息,如姓名、性别、职位等。
薪资项目设置:定义薪资构成项目,如基本工资、奖金、津贴等。
薪资发放管理:记录薪资发放记录,包括发放时间、发放金额等。
薪资计算:根据员工的薪资项目和考勤数据,自动计算员工的薪资总额。
报表生成:生成薪资明细报表、薪资汇总报表等,方便管理人员进行统计分析

一、ER图

二、数据库模型图

三、DDL

CREATE TABLE Employees (
    employee_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '员工ID',
    name VARCHAR(100) NOT NULL COMMENT '员工姓名',
    gender ENUM('男', '女') NOT NULL COMMENT '性别',
    position VARCHAR(100) NOT NULL COMMENT '职位',
    hire_date DATE NOT NULL COMMENT '入职日期'
);
 
CREATE TABLE SalaryItems (
    item_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '薪资项目ID',
    item_name VARCHAR(100) NOT NULL COMMENT '薪资项目名称',
    description VARCHAR(255) COMMENT '薪资项目描述'
);
 
CREATE TABLE SalaryStandards (
    standard_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '薪资标准ID',
    item_id INT NOT NULL COMMENT '薪资项目ID',
    amount DECIMAL(10, 2) NOT NULL COMMENT '薪资金额',
    FOREIGN KEY (item_id) REFERENCES SalaryItems(item_id)
);
 
CREATE TABLE SalaryDetails (
    detail_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '薪资详情ID',
    employee_id INT NOT NULL COMMENT '员工ID',
    item_id INT NOT NULL COMMENT '薪资项目ID',
    amount DECIMAL(10, 2) NOT NULL COMMENT '薪资金额',
    payment_date DATE NOT NULL COMMENT '支付日期',
    FOREIGN KEY (employee_id) REFERENCES Employees(employee_id),
    FOREIGN KEY (item_id) REFERENCES SalaryItems(item_id)
);
 
CREATE TABLE SalaryPayments (
    payment_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '支付ID',
    payment_date DATE NOT NULL COMMENT '支付日期',
    total_amount DECIMAL(10, 2) NOT NULL COMMENT '总金额'
);
 
CREATE TABLE SalaryPaymentDetails (
    detail_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '支付详情ID',
    payment_id INT NOT NULL COMMENT '支付ID',
    employee_id INT NOT NULL COMMENT '员工ID',
    amount DECIMAL(10, 2) NOT NULL COMMENT '支付金额',
    FOREIGN KEY (payment_id) REFERENCES SalaryPayments(payment_id),
    FOREIGN KEY (employee_id) REFERENCES Employees(employee_id)
);

四、DML

INSERT INTO Employees (name, gender, position, hire_date) VALUES
('孙悟空', '男', '程序员', '2020-01-01'),
('白骨精', '女', '产品经理', '2020-02-15'),
('猪八戒', '男', 'UI设计师', '2020-03-08');
INSERT INTO SalaryItems (item_name, description) VALUES
('基本工资', '员工的基本薪资'),
('奖金', '根据业绩发放的额外薪资'),
('交通补贴', '用于员工上下班交通费用的补贴');
INSERT INTO SalaryStandards (item_id, amount) VALUES
(1, 5000.00), -- 基本工资
(2, 2000.00), -- 奖金
(3, 500.00);  -- 交通补贴
INSERT INTO SalaryDetails (employee_id, item_id, amount, payment_date) VALUES
(1, 1, 5000.00, '2023-04-30'), -- 孙悟空的基本工资
(1, 2, 2000.00, '2023-04-30'), -- 孙悟空的奖金
(1, 3, 500.00, '2023-04-30'),  -- 孙悟空的交通补贴
(2, 1, 5000.00, '2023-04-30'), -- 白骨精的基本工资
(2, 3, 500.00, '2023-04-30'),  -- 白骨精的交通补贴
(3, 1, 5000.00, '2023-04-30'), -- 猪八戒的基本工资
(3, 3, 500.00, '2023-04-30');  -- 猪八戒的交通补贴
INSERT INTO SalaryPayments (payment_date, total_amount) VALUES
('2023-04-30', 15500.00), -- 假设总金额为所有员工薪资之和
('2023-05-30', 15000.00), -- 假设5月份没有奖金,所以总金额减少
('2023-06-30', 15500.00); -- 假设6月份又发放了奖金
INSERT INTO SalaryPaymentDetails (payment_id, employee_id, amount) VALUES
(1, 1, 7500.00), -- 孙悟空4月工资:基本工资 + 奖金 + 交通补贴
(1, 2, 5500.00), -- 白骨精4月工资:基本工资 + 交通补贴
(1, 3, 5500.00), -- 猪八戒4月工资:基本工资 + 交通补贴
(2, 1, 5500.00), -- 孙悟空5月工资:没有奖金
(2, 2, 5500.00), -- 白骨精5月工资
(2, 3, 5500.00), -- 猪八戒5月工资
(3, 1, 7500.00), -- 孙悟空6月工资:基本工资 + 奖金 + 交通补贴(假设再次发放奖金)
(3, 2, 5500.00); -- 白骨精6月工资

五、三个简单查询

1.查询名为孙悟空的员工薪资详细
SELECT e.name, sd.item_id, si.item_name, sd.amount, sd.payment_date
FROM Employees e
JOIN SalaryDetails sd ON e.employee_id = sd.employee_id
JOIN SalaryItems si ON sd.item_id = si.item_id
WHERE e.name = '孙悟空';

2.查询每个薪资项目的平均工资
SELECT si.item_name AS 薪资项目名称, AVG(ss.amount) AS 平均薪资金额
FROM SalaryItems siJOIN SalaryStandards ss ON si.item_id = ss.item_id
GROUP BY si.item_id, si.item_name;
  

3.查询每个岗位的平均薪资(仅看基本工资)
SELECT e.position, AVG(ss.amount) AS average_salary
FROM Employees eJOIN SalaryDetails sd ON e.employee_id = sd.employee_id JOIN SalaryStandards ss ON
 sd.item_id = ss.item_id JOIN SalaryItems si ON ss.item_id = si.item_id
WHERE si.item_name = '基本工资'GROUP BY e.position;

六、复杂查询

1.查询所有员工在指定月份的总薪资,包括基本工资,奖金和交通补贴
SELECT     e.name AS 员工姓名,    SUM(sd.amount) AS 总薪资FROM  Employees eJOIN     SalaryDetails sd 
ON e.employee_id = sd.employee_idWHERE 
YEAR(sd.payment_date) = 2023 AND MONTH(sd.payment_date) = 4GROUP 
BY e.employee_id, e.nameORDER BY     总薪资 DESC;

2.查询每个职位的平均薪资(仅包括基本工资)
SELECT     e.position AS 职位,    AVG(CASE WHEN si.item_name = '基本工资' THEN sd.amount ELSE 0 END) AS 平均基本工资FROM   
  Employees eJOIN     SalaryDetails sd ON e.employee_id = sd.employee_id
JOIN     SalaryItems si ON sd.item_id = si.item_id
GROUP BY     e.positionORDER BY     平均基本工资 DESC;

3.查询每个员工的总薪资(包括所有薪资项目)
SELECT     e.name AS 员工姓名,    SUM(sd.amount) AS 总薪资
FROM     Employees eJOIN     SalaryDetails sd ON e.employee_id = sd.employee_id
GROUP BY     e.employee_id, e.nameORDER BY     总薪资 DESC;

七、三个触发器和对应测试语句

1.在插入薪资时,确保薪资金额不超过薪资标准
DELIMITER //CREATE TRIGGER trg_before_salary_details_insert
BEFORE INSERT ON SalaryDetailsFOR EACH ROWBEGIN  
  DECLARE std_amount DECIMAL(10, 2); 
   SELECT amount INTO std_amount FROM SalaryStandards WHERE item_id = NEW.item_id; 
   IF NEW.amount > std_amount THEN  
      SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '薪资金额不能超过薪资标准!';    END IF;END;//DELIMITER ;

测试语句:尝试插入一个超过薪资标准的薪资详情

INSERT INTO SalaryDetails (employee_id, item_id, amount, payment_date) VALUES (4, 1, 6000.00, '2023-07-01’);

上面的测试语句应该会抛出一个错误,因为6000.00超过了基本工资的薪资标准5000.00

2.在插入薪资支付详细时,自动更新薪资支付的总金额
DELIMITER //CREATE TRIGGER trg_after_salary_payment_details_insert
AFTER INSERT ON SalaryPaymentDetailsFOR EACH ROWBEGIN  
  UPDATE SalaryPayments    SET total_amount = total_amount + NEW.amount  
  WHERE payment_id = NEW.payment_id;END;//DELIMITER ;
n 测试语句:插入一个新的薪资支付详情,并检查薪资支付的总金额是否已更新
INSERT INTO SalaryPaymentDetails (payment_id, employee_id, amount) VALUES (4, 1, 2500.00);

n -- 假设payment_id=4是一个新的支付ID-- 检查薪资支付的总金额是否已更新

SELECT * FROM SalaryPayments WHERE payment_id = 4;
3.当员工离职时,自动删除其所有的薪资详细和薪资支付详细
DELIMITER //CREATE TRIGGER trg_after_employee_hire
AFTER INSERT ON EmployeesFOR EACH ROWBEGIN    -- 假设基本工资的item_id总是1    
INSERT INTO SalaryDetails (employee_id, item_id, amount, payment_date)  
  VALUES (NEW.employee_id, 1, 
(SELECT amount FROM SalaryStandards WHERE item_id = 1), CURDATE());END;//DELIMITER ;
n 测试语句:-- 插入一个新员
工INSERT INTO Employees (name, gender, position, hire_date) VALUES('沙和尚', '男', '测试工程师', '2023-07-01

八、存储过程和对应测试语句

DELIMITER //CREATE TRIGGER trg_after_employee_hireAFTER INSERT ON EmployeesFOR EACH ROWBEGIN    
DECLARE base_salary_amount DECIMAL(10, 2);    -- 假设基本工资的item_id总是1,检查是否存在对应的薪资标准    
SELECT amount INTO base_salary_amount FROM SalaryStandards WHERE item_id = 1;    -- 检查是否成功获取到基本工资的金额   
 IF base_salary_amount IS NOT NULL THEN        -- 如果成功获取到,则插入到SalaryDetails表中       
 INSERT INTO SalaryDetails (employee_id, item_id, amount, payment_date)       
 VALUES (NEW.employee_id, 1, base_salary_amount, CURDATE());    ELSE        -- 如果没有获取到基本工资的金额(可能是SalaryStandards表中没有对应的记录),则使用一个默认值        
INSERT INTO SalaryDetails (employee_id, item_id, amount, payment_date)        VALUES (NEW.employee_id, 1, 0.00, CURDATE());        -- 或者,你可以选择取消下面的注释来抛出一个错误        -- SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '基本工资的薪资标准未设置!';    END IF;END;//DELIMITER ;

测试语句:

INSERT INTO Employees (name, gender, position, hire_date) VALUES('沙和尚', '男', '测试工程师', '2023-07-01’);
SELECT * FROM SalaryDetails WHERE employee_id = (SELECT employee_id FROM Employees WHERE name = '沙和尚' LIMIT 1);

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
人事工资管理系统 1问题描述 1.1设计目的 本系统的设计目标是能够对该公司的员工的基本信息和工资信息进行添加和修改 ,根据个人信息将工资分为职务工资,职称工资和其他工资.能够调整工资标准和员 工信息,也能够调整其他工资项目,根据需要对教职员工基本信息和工资信息的查询 ,系统应该包括系统用户数据的添加,修改和删除。系统应该具有简单,易用,小巧 ,经典的特色,应该能够对高校工资管理进行优化,使其系统化,高效化,智能化。 并保证工资管理的准确性,简易性,为公司财务人员提供便利。 1.2设计背景 随着市场经济的快速发展,公司规模越来越大,员工的数量也越来越多,员工工 资管理更加的复杂,而工资管理是一项琐碎、复杂而又十分细致的工作,工资计算、 发放、核算的工作量很大,一般不允许出错,如果实行手工操作,每月发放工资须手 工填制大量的表格,这就会耗费工作人员大量的时间和精力,计算机进行工资发放工 作,不仅能够保证工资核算准确无误、快速输出,而且还可以利用计算机对有关工资 的各种信息进行统计,服务于财务部门其他方面的核算和财务处理,同时计算机具有 着手工管理所无法比拟的优点。例如:检索迅速、查找方便、可靠性高、存储量大、 保密性好、寿命长、成本低等。这些优点能够极大地提高人事工资资管理的效率,也 是企业的科学化、正规化管理,与世界接轨的重要条件。这就对人事工资管理提出了 新的要求,用计算机管理系统来管理高校工资已经成为目前的趋势,使用计算机可以 高速,快捷地完成以上工作。在计算机联网后,数据在网上传递,可以实现数据共享, 避免重复劳动,规范数据管理行为,从而提高了管理效率和水平。人事工资管理系统 便是以计算机为工具,通过对工资管理所需的信息管理,不仅把管理人员从繁琐的数 据计算处理中解脱出来,而且优化了管理体系,使其高效化,简易化,智能化,也提高 了透明度和互动性. 2系统目标和建设原则 2.1系统目标 某公司决定建立"工资管理系统",以取代单一的人工管理。根据人员基本情况表 中的职位、职称及工龄长短,决定工资表中的基本工资和岗位津贴的具体数值。根据 各部门上报的扣款表的内容决定工资表中扣款项的金额.按月汇总工资表。 2.2建设原则 根据我们确定的工资数据库的设计思想,我们提出我建设原则如下: A.高可靠性: 该系统是该公司进行工资管理、员工信息管理、日常行政管理和奖惩管理 的基础设施,要求有很高的可靠性,以此建立起稳定、实用的应用环境,因此系 统方案设计就以高可靠性为首要原则。 B.安全性: 系统平台和系统平台数据的安- —对网络系统应严格地管理,并通过防火墙和有效设置权限等方法加强系统平台 和数据的安全。 C.实用性: 选择适合公司应用规模和层次的技术,需求操作平台充分考虑其性价比和 适用性,网络管理简单方便、可维护性强,以降低系统管理、运行、维护和升 级费用,增强可使用性。 D.规范、开放:   坚持开放性和标准化原则,采用的各种系统平台、协议、技术、开发工具、 应用系统是开放的、标准化的和可维护的。 3运行环境规划 选择微软平台作为主导,一方面考虑目前微软的飞速发展,越来越多的企业在规 划内部网络时,将微软平台作为首选方案;另一方面从技术角度来讲,微软平台上的 应用无论是在开发上,还是在软件的部署上都非常容易,而且性能优越. A.开发工具与语言:visual basic 6。0 B.中文版硬件环境:CPU型号为Pentium 以上,内存128M以上。 C.系统环境:Linux及Windows98以上系统均可。 D.DBMS开发工具:MS SQL Server 2005 4需求分析说明 4。1功能需求描述 A.员工基本信息模块 员工基本信息模块具有员工信息输入、员工增删、员工信息查询三个功能,员工基 本信息包括员工号、员工姓名、员工性别、所在职位、具体职称、工龄和工资等级等 信息。员工增删实现了对数据库中员工信息的增加和删除。员工可以通过员工号或员 工姓名对员工信息进行查询。 B.工资结构设置模块 根据该公司的工资管理实际情况,本系统将工资结构分为职位工资、职称工资、 工龄工资、其他工资四部分.该模块可以对这四个工资类型设置工资等级,并对每个等 级设置工资标准. C.工资汇总模块 用户在员工信息管理模块对该员工的工资等级进行输入以后,在工资汇总模块会自 动对员工工资进行汇总。用户可以打印出工资汇总表,打印之前可以通过打印预览功 能进行打预览。 以下便是该系统的功能模块示意图: 图4.2人事工资管理系统功能模块结构图 4。3数据库设计 4。3.1数据库介绍 所谓数据库(Database)就是指按一定组织方式存储在一起的,相互有关的若 干个数据的结合,数据库管理系统(database Management System)就是一种操纵和管理
数据库做的企业工资管理系统。摘 要 企业的工资管理是公司管理的一个重要内容。随着企业人员数量增加,企业的工资管理工作也变得越来越复杂。工资管理既涉及到企业劳动人事的管理,同时也是企业财务管理的重要组成部分。工资管理需要和人事管理相联系,同时连接工时考勤和医疗保险等等,来生成企业每个职工的基本工资、津贴、医疗保险、保险费、实际发放工资等。资金是企业生存的主要元素,资金的流动影响到企业的整体运作,企业员工的工资是企业资金管理的一个重要的组成部分。早期的工资统计和发放都是使用人工方式处理纸质材料,不仅花费财务人员大量的时间且不易保存,往往由于个人的因素抄写不慎或计算疏忽,出现工资发放错误的现象。早期工资管理多采取纸质材料和具有较强的时间限制。基于以上原因,企业工资管理系统使用电脑安全保存、快速计算、全面统计,实现工资管理的系统化、规范化、自动化。企业工资管理系统是典型的信息管理系统(MIS),前台程序开发工具采用微软的VB6,后台数据库采用Access数据库。VB6是一种面向对象的开发工具,具有组件丰富、语言简单、功能强大的优点。 Access数据库具有与VB6无缝连接、操作简单、易于使用的优点。运行结果证明,本企业工资管理系统极大提高了工作效率,节省了人力和物力,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值