Sql Oracle生成多个记录

Sql Oracle生成多个记录,sql,oracle,Sql,Oracle,基于数字列值,需要通过将其除以常量值25来生成多个记录。如果商为1,则生成一条记录,如果商为2,则生成两条记录,依此类推 样本数据: ID,DATE,NUMBER A1,20160415,25 A2,20170510,50 A3,20180715,100 输出: ID,DATE,NUMBER A1.1,2016415,25 A2.1,20170510,50 A2.2,20170510,50 A3.1,20180715,100 A3.2,20180715,100 A3.3,20

基于数字列值,需要通过将其除以常量值25来生成多个记录。如果商为1,则生成一条记录,如果商为2,则生成两条记录,依此类推

样本数据:

ID,DATE,NUMBER

A1,20160415,25

A2,20170510,50

A3,20180715,100
输出:

ID,DATE,NUMBER

A1.1,2016415,25

A2.1,20170510,50

A2.2,20170510,50

A3.1,20180715,100

A3.2,20180715,100

A3.3,20180715,100

A3.4,20180715,100
我尝试使用CONNECTBY子句,但没有得到预期的结果

您可以按以下方式使用connect by:

Select t.id || '.' || nums.lvl as id,
T.date,
T.number 
From your_table t
Join (Select level as lvl from
(Select max(number)/25 as num from your_table)
Connect by level <= num) nums -- generating rows with value 1,2,3... till max value for the number/25. In our case 4 values
On (t.number/25 >= lvl) -- joining based on number of rows to be created for each row
我希望数字列中没有不是25的倍数的值

干杯

或者:

SQL> with your_table (id, cdate, cnumber) as
  2    (select 'a1', 20160415,  25 from dual union all
  3     select 'a2', 20170510,  50 from dual union all
  4     select 'a3', 20180715, 100 from dual
  5    )
  6  select id, cdate, cnumber
  7  from your_table cross join table(cast(multiset(select level from dual
  8                                                 connect by level <= cnumber / 25
  9                                                ) as sys.odcinumberlist))
 10  order by id;

ID      CDATE    CNUMBER
-- ---------- ----------
a1   20160415         25
a2   20170510         50
a2   20170510         50
a3   20180715        100
a3   20180715        100
a3   20180715        100
a3   20180715        100

7 rows selected.

SQL>

你能解释一下逻辑吗?