我们正在与客户合作,他们的值字段的最大字符数是10。因此,如果我们有一个值记录的字符数超过10,比如50000000.00(即11),则该记录将被系统拒绝。我想做的是把一个记录中的值,拆分成多个记录。例如,这个基本记录:
SELECT 'ACCT_A' ACCT_NUM, 50000000.00 TOT_AMT
FROM TABLE_NAME
FETCH FIRST 1 ROWS ONLY;
字符串
| TOT_AMT| TOT_AMT |
| --| ------------ |
| 50000000.00| 50000000.00 |
我想创建一个动态SQL语句,该语句将继续将一条记录拆分为多条记录,然后我们可以将这些记录传递给客户。我试着用LAG函数做些什么,但我似乎不能完全得到它。由于9999999.99是它们可以拥有的最大数量(这是最大字符长度为10的最高值数字),我试图提出一个查询,最终输出类似于以下内容:
| TOT_AMT| TOT_AMT |
| --| ------------ |
| 9999999.99| 9999999.99 |
| 9999999.99| 9999999.99 |
| 9999999.99| 9999999.99 |
| 9999999.99| 9999999.99 |
| 9999999.99| 9999999.99 |
| 0.05| 0.05 |
有人能帮助实现这一点吗?TOT_AMT并不总是50,000,000,因此查询需要足够动态,以接受任何值作为TOT_AMT,并在需要时相应地拆分它(这可能包括某种CASE语句,如下所示:CASE WHEN TOT_AMT > 999999.99 THEN 9999999.99 ELSE TOT_AMT END)。
这是我所能得到的:
WITH TEMP_SPLIT_TABLE AS (
SELECT 'ACCT_A' ACCT_NUM, 50000000.00 TOT_AMT FROM TABLE_NAME FETCH FIRST 1 ROWS ONLY
)
SELECT ACCT_NUM, TOT_AMT, CASE WHEN TOT_AMT > 9999999.99 THEN 9999999.99 ELSE TOT_AMT END AS ACCT_AMT,
CASE WHEN TOT_AMT > 9999999.99 THEN LAG(TOT_AMT - 9999999.99) OVER (PARTITION BY ACCT_NUM ORDER BY 1) ELSE 0 END LAG_VAL
FROM TEMP_SPLIT_TABLE
型
我只返回了一条记录,我不确定如何调优SQL,使其继续运行并使用LAG函数,直到TOT_AMT值被拆分为=<999999.99。
1条答案
按热度按时间huus2vyu1#
您可以使用递归公用表表达式来实现此目的。
字符串
| TOT_AMT| TOT_AMT |
| --| ------------ |
| 9999999.99| 9999999.99 |
| 9999999.99| 9999999.99 |
| 9999999.99| 9999999.99 |
| 9999999.99| 9999999.99 |
| 9999999.99| 9999999.99 |
| 0.05| 0.05 |
| 9999999.99| 9999999.99 |
| 9999999.99| 9999999.99 |
| 9999999.99| 9999999.99 |
| 9999999.99| 9999999.99 |
| 零点零四| 0.04 |
fiddle