Во-первых, , пожалуйста, не используйте зарезервированные слова Oracle ("дата", "регистр", "тип") в качестве имен столбцов! Двойные кавычки для каждого имени столбца становятся утомительными.
Итак, это довольно сложный сценарий.Вы пытаетесь сделать 3 уровня агрегации на одной таблице.
Кроме того, функции Oracle XML дают вам ограниченную возможность создавать XML на лету в запросах.Единственный известный мне способ смешать данные столбца (xmlelement) и строки (xmlagg) на одном уровне иерархии XML - это объединить их с помощью конструктора xmlelement
.
Кроме того, я предположил, что ваш "Тег / ROOT / REGISTERS / DETAILS / BAG "был опечаткой, и вы имели в виду" CASE ".
Но я думаю, это то, что вы просите.
create table cash (register number, "DATE" date, "CASE" number, bag number, "TYPE" varchar2(1));
insert into cash values (1234, to_date('09/24/2018', 'mm/dd/yyyy'), 1123, 112, 'A');
insert into cash values (1234, to_date('09/24/2018', 'mm/dd/yyyy'), 1124, 113, 'S');
insert into cash values (1234, to_date('09/24/2018', 'mm/dd/yyyy'), 1123, 116, 'S');
insert into cash values (1234, to_date('09/24/2018', 'mm/dd/yyyy'), 1124, 117, 'A');
insert into cash values (7895, to_date('09/24/2018', 'mm/dd/yyyy'), 2568, 119, 'A');
insert into cash values (7895, to_date('09/24/2018', 'mm/dd/yyyy'), 2568, 118, 'S');
select xmlelement("ROOT",
xmlagg(xmlelement("REGISTERS",
xmlelement("REGISTER", t1.register),
xmlelement("DATE", t1."DATE"),
(select xmlagg(xmlelement("DETAILS",
xmlelement("CASE", t2."CASE"),
(select xmlagg(xmlelement("DETAIL",
xmlforest(t3.bag, t3."TYPE"))
)
from (select bag, "TYPE" from cash
where cash."REGISTER" = t2."REGISTER" and cash."DATE" = t2."DATE"
and cash."CASE" = t2."CASE") t3)
))
from (select distinct register, "DATE", "CASE" from cash
where cash."REGISTER" = t1."REGISTER" and cash."DATE" = t1."DATE") t2
)
)
)
) as xml_data
from (select distinct register, "DATE" from cash) t1
;
Выход:
<ROOT>
<REGISTERS>
<REGISTER>1234</REGISTER>
<DATE>2018-09-24</DATE>
<DETAILS>
<CASE>1123</CASE>
<DETAIL>
<BAG>112</BAG>
<TYPE>A</TYPE>
</DETAIL>
<DETAIL>
<BAG>116</BAG>
<TYPE>S</TYPE>
</DETAIL>
</DETAILS>
<DETAILS>
<CASE>1124</CASE>
<DETAIL>
<BAG>113</BAG>
<TYPE>S</TYPE>
</DETAIL>
<DETAIL>
<BAG>117</BAG>
<TYPE>A</TYPE>
</DETAIL>
</DETAILS>
</REGISTERS>
<REGISTERS>
<REGISTER>7895</REGISTER>
<DATE>2018-09-24</DATE>
<DETAILS>
<CASE>2568</CASE>
<DETAIL>
<BAG>119</BAG>
<TYPE>A</TYPE>
</DETAIL>
<DETAIL>
<BAG>118</BAG>
<TYPE>S</TYPE>
</DETAIL>
</DETAILS>
</REGISTERS>
</ROOT>