with
-- ΠΏΠ°ΠΊΠ΅ΡΡ
p as (
select 3 as cnt from dual
union all
select 2 as cnt from dual
union all
select 5 as cnt from dual
union all
select 2 as cnt from dual
union all
select 1 as cnt from dual
),
-- Π±ΡΡΡΠ»ΠΊΠΈ
b as (
select level as num
from dual
connect by level <= 0
)
-- ΠΏΠ°ΠΊΠ΅ΡΡ Ρ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠ²ΡΠΈΠΌΠΈΡΡ Π±ΡΡΡΠ»ΠΊΠ°ΠΌΠΈ
select 'ΠΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ '||c2.pack_cnt as pack,
listagg(c2.bottle_num,', ') within group (order by c2.bottle_num) as bottles
from (
-- Π±ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΌΠ΅ΡΡΠ°Ρ Π² ΠΏΠ°ΠΊΠ΅ΡΠ°Ρ
select c1.*,
-- ΡΠΎΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΠΌΠ΅ΡΡΠΎ Π² ΠΏΠ°ΠΊΠ΅ΡΠ΅ Π½ΠΎΠΌΠ΅ΡΡ Π±ΡΡΡΠ»ΠΊΠΈ ΠΏΠΎ ΠΏΠΎΡΡΠ΄ΠΊΡ
(select bb.bottle_num
from (select row_number() over (order by b.num) as bottle_num from b) bb
where bb.bottle_num = c1.pack_place) bottle_num
from (
-- ΠΌΠ΅ΡΡΠ° Π² ΠΏΠ°ΠΊΠ΅ΡΠ°Ρ
select p.pack_num,
p.pack_cnt,
row_number() over (order by p.pack_num,d.n) as pack_place
from (select row_number() over (order by p.cnt desc) as pack_num, p.cnt as pack_cnt from p) p,
(select level as n from dual connect by level <= (select max(p.cnt) from p)) d
where d.n <= p.pack_cnt
order by p.pack_num,d.n
)c1
)c2
group by c2.pack_num,c2.pack_cnt
order by c2.pack_num;