编写SQL自定义函数实现奖金乘3与重复奖金检测功能运行异常求助
问题分析
原代码存在以下问题:
- 未实现奖金乘以3的计算逻辑
- 重复奖金判断逻辑不符合需求:仅校验传入奖金和当前员工的存储奖金是否一致,没有统计同奖金对应的员工总数
- 未给返回值设置兜底默认值,不满足错误条件时会返回NULL
- 未处理数值转字符串的逻辑,无法兼容数字计算结果和文本提示的混合返回需求
修正方案
修正后的逻辑为:当传入的奖金对应的员工人数≥2时返回要求的提示文本,否则返回该奖金乘以3的计算结果,移除了无用的@workers参数。
CREATE FUNCTION newfunction ( @bonus AS INT ) RETURNS VARCHAR(25) AS BEGIN DECLARE @bonus_worker_count INT DECLARE @return_value VARCHAR(25) -- 统计当前奖金对应的员工总人数 SELECT @bonus_worker_count = COUNT(*) FROM Employeestbl WHERE Bonus = @bonus IF @bonus_worker_count >= 2 SET @return_value = 'two workers have same bonus amount' ELSE -- 无重复时计算三倍奖金并转为字符串 SET @return_value = CAST(@bonus * 3 AS VARCHAR(25)) RETURN @return_value END
调用方式:
SELECT *, dbo.newfunction(Employeestbl.Bonus) AS calculation_result FROM Employeestbl
运行结果(匹配你的样例数据)
| Bonus | Workers | calculation_result |
|---|---|---|
| 90 | 1 | two workers have same bonus amount |
| 90 | 2 | two workers have same bonus amount |
| 50 | 3 | 150 |
| 40 | 4 | 120 |
| 30 | 5 | 90 |
| 20 | 6 | 60 |
| 10 | 7 | 30 |
如果你需要的逻辑是只要全表存在任意一笔重复奖金,所有行都返回提示,只需要把统计人数的SQL替换为以下代码即可:
SELECT @bonus_worker_count = COUNT(*) FROM ( SELECT Bonus FROM Employeestbl GROUP BY Bonus HAVING COUNT(*) >= 2 ) AS duplicate_bonus
内容的提问来源于stack exchange,提问作者Alisahib Qadimov
相关产品推荐
相关产品推荐

