SQL查询实现从单条数据生成金额逐行递增8%的6行结果
生成递增8%的6行数据的SQL解决方案
这里有两种实用的方法来实现你要的效果,都能精准生成那6行金额递增8%的数据:
方法一:递归CTE(推荐,灵活扩展性强)
递归CTE是生成序列数据的绝佳工具,尤其适合这种需要基于前一行计算后一行的场景。下面的查询会从你的money表中取出目标数据,然后递归生成后续行:
WITH RECURSIVE amount_series AS ( -- 锚点:取出原始数据作为第一行 SELECT AMOUNT, ID, 1 AS row_num FROM money WHERE ID = 'AAA' AND AMOUNT = 100.00 UNION ALL -- 递归:计算下一行的金额,直到生成6行 SELECT ROUND(prev.AMOUNT * 1.08, 2) AS AMOUNT, prev.ID, prev.row_num + 1 AS row_num FROM amount_series prev WHERE prev.row_num < 6 ) SELECT AMOUNT, ID FROM amount_series;
代码解释:
- 锚点成员:精准定位到
money表中ID为AAA、金额为100.00的那条数据,作为序列的起始行,同时用row_num标记当前是第几行。 - 递归成员:基于上一行的金额乘以1.08(实现8%递增),用
ROUND()函数保留两位小数,行号加1。递归会一直执行到row_num等于6时停止。 - 最后从递归CTE中查询结果,就能得到你预期的6行数据。
方法二:数字序列表(适合固定行数的简单场景)
如果你的数据库版本不支持递归CTE(比如MySQL 8.0之前的版本),可以用硬编码的数字序列来直接计算每一行的金额:
SELECT ROUND(100.00 * POWER(1.08, n - 1), 2) AS AMOUNT, 'AAA' AS ID FROM ( -- 生成1到6的数字序列 SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 ) AS number_list;
代码解释:
- 子查询
number_list生成了1到6的数字,对应我们需要的6行数据。 - 用
POWER(1.08, n-1)计算递增倍数:第1行是100*(1.08)0=100,第2行是100*(1.08)1=108,以此类推,最后用ROUND()保留两位小数。
两种方法都能输出你要的结果:
100.00 AAA、108.00 AAA、116.64 AAA、125.97 AAA、136.04 AAA、146.93 AAA
内容的提问来源于stack exchange,提问作者Volcano
相关产品推荐
相关产品推荐

