SQL关联员工与交易表查询 汇总个人佣金并保留两位小数
问题背景
- 业务库包含两张表:
EMPLOYEE:存储包含销售人员在内的所有员工信息TRANSACTION:存储全量交易记录
- 查询目标:关联两张表,返回员工的名(fName)、姓(lName),以及按交易金额2.5%比例计算的佣金
- 原有查询存在两个待修复问题:
- 佣金字段小数位数不统一,部分结果显示三位小数,需统一保留两位小数
- 同一员工对应多笔交易时会返回多条重复记录,需按员工维度汇总佣金,实现每位员工仅返回一条汇总记录
原有SQL语句
SELECT fName, lName, Amount_Due * 0.025 AS Commission FROM EMPLOYEE, "TRANSACTION" WHERE EMPLOYEE.Eid = "TRANSACTION".eID
原查询返回结果示例
| fNAME | lNAME | Commission |
|---|---|---|
| Jane | Doe | 20.00 |
| Jane | Doe | 12.00 |
| Jack | Jones | 10.000 |
| Jack | Jones | 15.000 |
| John | Doe | 12.000 |
| John | Doe | 14.00 |
修正方案
核心修正逻辑:
- 替换原有隐式表连接为显式
INNER JOIN写法,逻辑更清晰,便于后续维护 - 使用
GROUP BY按员工唯一ID、姓名维度分组,通过SUM()函数累加同一名员工所有交易对应的佣金,解决单员工多条记录的问题 - 使用
ROUND()函数对汇总后的佣金做精度处理,统一保留两位小数
修正后SQL代码:
SELECT e.fName, e.lName, ROUND(SUM(t.Amount_Due * 0.025), 2) AS Commission FROM EMPLOYEE e INNER JOIN "TRANSACTION" t ON e.Eid = t.eID GROUP BY e.Eid, e.fName, e.lName
可选扩展:如果需要返回无任何交易记录的员工(对应佣金显示为0.00),可将
INNER JOIN替换为LEFT JOIN,同时增加空值处理逻辑,代码如下:SELECT e.fName, e.lName, ROUND(COALESCE(SUM(t.Amount_Due * 0.025), 0), 2) AS Commission FROM EMPLOYEE e LEFT JOIN "TRANSACTION" t ON e.Eid = t.eID GROUP BY e.Eid, e.fName, e.lName
内容的提问来源于stack exchange,提问作者Kris Ellison
相关产品推荐
相关产品推荐

