AI写的不用游标派发明细数量例子

2024-09-02 15:20

本文主要是介绍AI写的不用游标派发明细数量例子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 需求:

请在sqlserver设计数据库表以及编写sql实现如下需求:有个课目奖金表,登记各课目奖金池; 一个班有36位学生,每人每课目成绩不同,按学号顺序,如果成绩在90-100之间奖励200块,80-89之间奖励100块,70-79之间奖励50,其他不奖励,要考虑奖金是否派完的情况,最好不要用游标实现。首先,学生表要有金额字段,先更新金额字段然后显示这个表内容和各课目奖金池剩余金额

其实这种需求在ERP/MES系统中很多地方都要用,比如CMI登记的是明细,但要需要合并发料,发料后要回写明细。

GPT给出用CTE递归实现的方案,值得学习:
创建测试表及数据:

-- 课目奖金池表
CREATE TABLE SubjectBonus (SubjectCode NVARCHAR(50) PRIMARY KEY,  -- 课目代码TotalBonus INT                         -- 总奖金池
);-- 学生表
CREATE TABLE Students (StudentID INT,                         -- 学号SubjectCode NVARCHAR(50),              -- 课目代码Score INT,                             -- 成绩RewardAmount INT,                      -- 奖励金额PRIMARY KEY (StudentID, SubjectCode)  -- 复合主键
);
-- 插入课目奖金池数据
INSERT INTO SubjectBonus (SubjectCode, TotalBonus)
VALUES ('Math', 10000), ('Science', 10000);  -- 假设每个课目的初始奖金池为 10000-- 插入学生成绩数据
INSERT INTO Students (StudentID, SubjectCode, Score)
VALUES
(1, 'Math', 95), (2, 'Math', 85), (3, 'Math', 75), -- Math 科目成绩
(1, 'Science', 88), (2, 'Science', 92), (3, 'Science', 70); -- Science 科目成绩

更新学生表中的奖励金额

-- 使用 CTE 计算每个学生的奖金,并插入到临时表
WITH OrderedStudents AS (SELECT StudentID,SubjectCode,Score,CASE WHEN Score BETWEEN 90 AND 100 THEN 200WHEN Score BETWEEN 80 AND 89 THEN 100WHEN Score BETWEEN 70 AND 79 THEN 50ELSE 0END AS PotentialReward,ROW_NUMBER() OVER(PARTITION BY SubjectCode ORDER BY StudentID) AS RowNumFROM Students
),
RewardCTE AS (-- 初始数据SELECT os.StudentID,os.SubjectCode,os.Score,os.PotentialReward,sb.TotalBonus AS RemainingBonus,os.RowNumFROM OrderedStudents osJOIN SubjectBonus sb ON os.SubjectCode = sb.SubjectCodeWHERE os.RowNum = 1UNION ALL-- 递归计算奖金SELECT os.StudentID,os.SubjectCode,os.Score,CASE WHEN r.RemainingBonus >= os.PotentialReward THEN os.PotentialRewardELSE r.RemainingBonusEND AS PotentialReward,r.RemainingBonus - CASE WHEN r.RemainingBonus >= os.PotentialReward THEN os.PotentialRewardELSE r.RemainingBonusEND AS RemainingBonus,os.RowNumFROM OrderedStudents osJOIN RewardCTE r ON os.SubjectCode = r.SubjectCode AND os.RowNum = r.RowNum + 1
)
-- 将 CTE 结果插入临时表
SELECT StudentID,SubjectCode,PotentialReward,RemainingBonus
INTO #TempRewards
FROM RewardCTE
WHERE RowNum = 1 OR EXISTS (SELECT 1 FROM RewardCTE subWHERE sub.SubjectCode = RewardCTE.SubjectCode AND sub.RowNum = RewardCTE.RowNum - 1
);-- 更新 Students 表中的 RewardAmount
UPDATE s
SET s.RewardAmount = tr.PotentialReward
FROM Students s
JOIN #TempRewards tr ON s.StudentID = tr.StudentID AND s.SubjectCode = tr.SubjectCode;-- 更新 SubjectBonus 表中的 TotalBonus
UPDATE sb
SET sb.TotalBonus = sb.TotalBonus - (SELECT SUM(s.RewardAmount)FROM Students sWHERE s.SubjectCode = sb.SubjectCode
)
FROM SubjectBonus sb;-- 显示更新后的学生表内容
SELECT StudentID, SubjectCode,Score, RewardAmount
FROM Students
ORDER BY SubjectCode,StudentID;-- 显示更新后的课目奖金池
SELECT SubjectCode, TotalBonus 
FROM SubjectBonus;-- 删除临时表
DROP TABLE #TempRewards;

这篇关于AI写的不用游标派发明细数量例子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130331

相关文章

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

三频BE12000国补到手2549元! ROG 魔盒Pro WIFI7电竞AI路由器上架

《三频BE12000国补到手2549元!ROG魔盒ProWIFI7电竞AI路由器上架》近日,华硕带来了ROG魔盒ProWIFI7电竞AI路由器(ROGSTRIXGR7Pro),目前新... 华硕推出了ROG 魔盒Pro WIFI7电竞AI路由器(ROG STRIX GR7 Phttp://www.cppcn

Spring AI 实现 STDIO和SSE MCP Server的过程详解

《SpringAI实现STDIO和SSEMCPServer的过程详解》STDIO方式是基于进程间通信,MCPClient和MCPServer运行在同一主机,主要用于本地集成、命令行工具等场景... 目录Spring AI 实现 STDIO和SSE MCP Server1.新建Spring Boot项目2.a

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav