Cуть. Во временную таблицу записываются результаты селекта.
Сам селект представляет собой запрос с промежуточными итогами (rollup) по каждому столбцу, доходящим до полного ИТОГО.
Все бы хорошо, но ....
Селект выводится всегда в правильном порядке.
А если его заинсертить в таблицу, то она уже выводится в неправильном (например, общее "ИТОГО" может быть посередине).
Вопрос - как сгруппировать ? пробовал order by вычисляемым полем-ключом, но получается значительный оверхед из-за сложных выражений . Либо надобность лезть во внутренний селект и добавлять вычисляемый столбец спецом для группировки - опять оверхед + его надо вносить под group by rollup .... , а иначе будет not group by expression.
А если уж вносить, то это породит лишнюю группу-одиночный итог после каждой строки, которую опять же надо отсекать либо having во внутреннем селекте, либо where во внешнем.
В общем, громоздко и некрасиво получается.
То есть, чтобы сохранить во временной таблице некий порядок строк, нужен какой-то искуственной генерируемый ключ для order by, а простого способа генерации его нет.
Тем временем обнаружил эмпирическим путем, что в качестве такого ключа можно использовать rowid.
Теперь вопрос в студию - всегда ли можно использовать rowid и гарантирует ли он правильный порядок строк в запросе с промежуточными итогами ?
insert into tmp$prepareGBRObjects(history_id, grp, district_id, person_type, estate_type, quantity)
select
gv_history_id, grp,
decode(grp, '011', 'Âñåãî ïî ' || district_id , district_id ) district_id,
decode(grp, '001', 'Âñåãî ïî ' || person_type , person_type ) person_type,
decode(grp,'111', 'ÈÒÎÃÎ: ', estate_type) estate_type,
quantity
from
(
-- <v .... CREATE OR REPLACE VIEW v_gbr$ as
select
grouping(o.gninmb) || grouping(decode(s.type_np,1,'ÞË','ÔË')) || grouping(o.code_im) grp,
o.gninmb district_id,
decode(s.type_np,1,'ÞË','ÔË') person_type,
o.code_im estate_type,
count(*) quantity
from krt_sgbr_n s,
krt_ogbr_n o
where s.isn_resp='1'
and o.id_object=s.id_object
and s.type_inf in (1,2,5,6) --ñîáñòâåííîñòü áåç àðåíäû 3,4 - àðåíäà
and
o.code_im in
(select parameter_value from int$report_user_query where history_id = gv_history_id and parameter_id = p_lookup)
and nvl(s.date_reg,s.date_control) <= d_dateFrom
and ((d_dateTill is null) or (nvl(s.date_reg_e ,s.date_control_end)<d_dateTill))
group by --to_char(nvl(s.date_reg,s.date_control),'yyyy'),
rollup
(
o.gninmb,
decode(s.type_np,1,'ÞË','ÔË'),
o.code_im
)
--- /> v
);