db2 复杂SQL问题:基于值字段将一条记录拆分为多条记录

kx1ctssn  于 10个月前  发布在  DB2
关注(0)|答案(1)|浏览(202)

我们正在与客户合作,他们的值字段的最大字符数是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。

huus2vyu

huus2vyu1#

您可以使用递归公用表表达式来实现此目的。

with 
  mytab (ACCT_NUM, TOT_AMT) as
(
  values 
  ('ACCT_A', 50000000.00)
, ('ACCT_B', 40000000.00)
)
, r (ACCT_NUM, TOT_AMT, LIM_AMT) as
(
  select 
    ACCT_NUM
  , TOT_AMT
  , 9999999.99
  from mytab
    union all
  select 
    ACCT_NUM
  , TOT_AMT - LIM_AMT
  , LIM_AMT
  from r
  where TOT_AMT > LIM_AMT
)
select 
  ACCT_NUM
, MIN (TOT_AMT, LIM_AMT) AS TOT_AMT
from r
order by 1, 2 desc

字符串
| 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

相关问题