Oracle数据库对比两表校验员工薪资发放差异SQL查询方法
Oracle 员工薪资比对查询实现
涉及表结构
- 员工标准薪资表:以
ID为主键,存储员工基础标准薪资,字段包含ID(员工唯一标识)、Name(员工姓名)、Salary(标准月薪,单位:美元) - 实际发薪流水表:存储支付系统同步的实际发薪记录,字段包含
ID(关联员工ID)、Date(发薪日期)、Salary(实际发放金额,单位:美元)
实现效果
- 可精准检索每一笔实际发放与标准薪资不符的明细记录,覆盖少发、多发两类异常
- 支持按员工维度统计任职周期内薪资异常的月份总数、累计薪资差额
具体SQL代码
异常发薪明细查询
用于定位每一笔异常发薪的具体月份、差额,比如ID为1的员工某月仅发放300的场景,可直接返回对应记录:
SELECT s.ID emp_id, s.Name emp_name, TRUNC(p.Date, 'MONTH') pay_month, s.Salary std_monthly_salary, p.Salary actual_paid_salary, p.Salary - s.Salary diff_amount FROM emp_salary_std s INNER JOIN emp_salary_paid p ON s.ID = p.ID WHERE p.Salary <> s.Salary;
返回字段中diff_amount为差额,单位美元:值为负代表少发,值为正代表多发。
员工维度异常统计
对应优先统计需求,返回每位员工的异常月份总数、累计差额:
SELECT s.ID emp_id, s.Name emp_name, COUNT(DISTINCT TRUNC(p.Date, 'MONTH')) abnormal_pay_month_count, SUM(p.Salary - s.Salary) total_diff_amount FROM emp_salary_std s INNER JOIN emp_salary_paid p ON s.ID = p.ID WHERE p.Salary <> s.Salary GROUP BY s.ID, s.Name;
使用注意事项
- SQL中
emp_salary_std、emp_salary_paid为示例表名,请替换为实际业务环境的真实表名 - 若需要覆盖员工无标准薪资、无发薪记录的边缘校验场景,可将
INNER JOIN替换为LEFT JOIN或FULL JOIN,补充对应空值处理逻辑即可 - 月份统计通过
TRUNC(日期, 'MONTH')将日期归一到当月维度,可避免同一月多次发薪导致的异常月份重复计数 - 差额计算未使用绝对值,直接通过正负值区分少发、多发场景,无需额外逻辑判断
内容的提问来源于stack exchange,提问作者Fahad
相关产品推荐
相关产品推荐

