🏆本文收录于《CSDN问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
问题描述
下列数据通过SQL语句查出,不是数据库底表的数据, 不能通过insert , update,delete 等来更改原始数据
先把序号从大到小排序,求出所有数量合计值 A = -20 , 再求出所有正数的合计值B = 100+20 = 120
然后从最大序号的负数(序号4 = -100)逐一向下与B合计,直到与B的合计值出现了负数(序号3 )。
此时,把A (-20) 覆盖到第一次出现负数的序号3即可。
如何用SQL实现,或提供思路
如上问题有来自我自身项目开发,有的收集网站,有的来自读者,如有侵权,立马删除。
解决方案
如下是上述问题的解决方案,仅供参考:
这个问题可以通过使用游标和递归的公用表表达式(CTE)来解决。以下是一个可能的解决方案的思路:
- 排序:首先,根据序号从大到小对数据进行排序。
- 计算合计值:使用聚合函数计算所有数量的合计值
A
和所有正数的合计值B
。 - 使用游标遍历:使用游标从最大的序号开始向下遍历,每次从
B
中减去当前行的数量,直到B
变成负数。 - 递归CTE:使用递归CTE来模拟游标的行为,逐步更新
B
的值,直到它变成负数。 - 覆盖操作:一旦
B
变成负数,使用最终的A
覆盖该行的数量。
以下是使用PostgreSQL数据库的示例SQL语句:
WITH RECURSIVE DataCTE AS (SELECT number_id,quantity,(SELECT SUM(quantity) FROM YourTable) AS total_sum_A,(SELECT SUM(CASE WHEN quantity > 0 THEN quantity ELSE 0 END) FROM YourTable) AS total_sum_BFROM YourTable
),
UpdatedCTE AS (SELECT number_id,quantity,total_sum_A,total_sum_B,quantity AS updated_quantityFROM DataCTEWHERE number_id = (SELECT MAX(number_id) FROM DataCTE)UNION ALLSELECT dt.number_id,dt.quantity,dt.total_sum_A,dt.total_sum_B - dt.quantity AS total_sum_B,CASE WHEN dt.total_sum_B < 0 THEN total_sum_A ELSE dt.quantity END AS updated_quantityFROM DataCTE dtINNER JOIN UpdatedCTE ut ON dt.number_id = ut.number_id - 1
)
SELECT number_id,updated_quantity
FROM UpdatedCTE
ORDER BY number_id DESC;
请注意,这个解决方案假设number_id
是一个连续的序号,并且可以通过number_id - 1
来获取上一行的数据。如果number_id
不是连续的,你需要根据实际情况调整递归逻辑。
这个解决方案可能需要根据你的具体数据库系统进行调整,因为不同的数据库系统对递归CTE的支持可能有所不同。如果你使用的是MySQL 8.0+,SQL Server或Oracle,它们都支持递归CTE,但是语法可能略有不同。
此外,由于题目要求不能更改原始数据,上述查询只是用来展示逻辑,并不实际修改任何数据。如果你需要将结果存储回数据库,可以考虑使用一个临时表或将结果插入到新表中。
希望如上措施及解决方案能够帮到有需要的你。
PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。
若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。
☀️写在最后
ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。
码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。
同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!
📣关于我
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。