Sql Oracle生成多个记录
基于数字列值,需要通过将其除以常量值25来生成多个记录。如果商为1,则生成一条记录,如果商为2,则生成两条记录,依此类推 样本数据: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
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>
你能解释一下逻辑吗?