Здравствуйте!
Есть задача из данных в одной таблице составить относительно сложный XML.
Хочу отметить, что со своей стороны опыта составления XML в PLSQL не имею и при попытке решить поставленную задачу столкнулся с проблемой, что никак не выходит у меня «Каменный цветок» в нужном формате. Либо куча мелких xml файлов, либо один, и все не в нужном формате. Никак не могу разобраться с правильной группировкой.
Ниже пример данных которые мы имеем и текст XML который нужно получить:
Данные:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
with lst as(
select 1 as DealNumber, 'Blank' as TypeDoc, 'RUR' as Currency, 'Our' as Owner, 10 as Quantity, 1000 as Nominal, 'Sell' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 23 as DealNumber, 'Bill' as TypeDoc, 'RUR' as Currency, 'Not ours ' as Owner, 20 as Quantity, 100 as Nominal, 'Buy' as TypeDeal, to_date('29.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 72 as DealNumber, 'Coin' as TypeDoc, 'USD' as Currency, 'Not ours' as Owner, 5 as Quantity, 1 as Nominal, 'Sell' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 21 as DealNumber, 'Blank' as TypeDoc, 'USD' as Currency, 'Our' as Owner, 10 as Quantity, 10 as Nominal, 'Buy' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 65 as DealNumber, 'Blank' as TypeDoc, 'RUR' as Currency, 'Not ours' as Owner, 100 as Quantity, 1000 as Nominal, 'Buy' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 17 as DealNumber, 'Bill' as TypeDoc, 'RUR' as Currency, 'Our' as Owner, 100 as Quantity, 1000 as Nominal, 'Sell' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 37 as DealNumber, 'Coin' as TypeDoc, 'RUR' as Currency, 'Our' as Owner, 100 as Quantity, 25 as Nominal, 'Sell' as TypeDeal, to_date('29.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 25 as DealNumber, 'Coin' as TypeDoc, 'RUR' as Currency, 'Our' as Owner, 100 as Quantity, 25 as Nominal, 'Sell' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
)
Select * from lst;
XML:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
<TESTXML>
<CURRENCY Currency="RUR">
<OWNER Owner="Our">
<TYPEDOC TypeDoc="Bill">
<RECORDS DealNumber="17" Quantity="100" Nominal="1000" TypeDeal="Sell" DateDeal="30.04.2019"/>
</TYPEDOC>
<TYPEDOC TypeDoc="Blank">
<RECORDS DealNumber="23" Quantity="10" Nominal="1000" TypeDeal="Sell" DateDeal="30.04.2019"/>
</TYPEDOC>
<TYPEDOC TypeDoc="Coin">
<RECORDS DealNumber="37" Quantity="100" Nominal="25" TypeDeal="Sell" DateDeal="29.04.2019"/>
<RECORDS DealNumber="65" Quantity="100" Nominal="25" TypeDeal="Sell" DateDeal="30.04.2019"/>
</TYPEDOC>
</OWNER>
<OWNER Owner="Not ours">
<TYPEDOC TypeDoc="Bill">
<RECORDS DealNumber="1" Quantity="20" Nominal="100" TypeDeal="Buy" DateDeal="29.04.2019"/>
</TYPEDOC>
<TYPEDOC TypeDoc="Blank">
<RECORDS DealNumber="21" Quantity="100" Nominal="1000" TypeDeal="Buy" DateDeal="30.04.2019"/>
</TYPEDOC>
</OWNER>
</CURRENCY>
<CURRENCY Currency="USD">
<OWNER Owner="Our">
<TYPEDOC TypeDoc="Blank">
<RECORDS DealNumber="25" Quantity="10" Nominal="10" TypeDeal="Buy" DateDeal="30.04.2019"/>
</TYPEDOC>
</OWNER>
<OWNER Owner="Not ours">
<TYPEDOC TypeDoc="Coin">
<RECORDS DealNumber="72" Quantity="5" Nominal="1" TypeDeal="Buy" DateDeal="30.04.2019"/>
</TYPEDOC>
</OWNER>
</CURRENCY>
</TESTXML>
Что пытался сделать:
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
with lst as(
select 1 as DealNumber, 'Blank' as TypeDoc, 'RUR' as Currency, 'Our' as Owner, 10 as Quantity, 1000 as Nominal, 'Sell' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 23 as DealNumber, 'Bill' as TypeDoc, 'RUR' as Currency, 'Not ours ' as Owner, 20 as Quantity, 100 as Nominal, 'Buy' as TypeDeal, to_date('29.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 72 as DealNumber, 'Coin' as TypeDoc, 'USD' as Currency, 'Not ours' as Owner, 5 as Quantity, 1 as Nominal, 'Sell' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 21 as DealNumber, 'Blank' as TypeDoc, 'USD' as Currency, 'Our' as Owner, 10 as Quantity, 10 as Nominal, 'Buy' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 65 as DealNumber, 'Blank' as TypeDoc, 'RUR' as Currency, 'Not ours' as Owner, 100 as Quantity, 1000 as Nominal, 'Buy' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 17 as DealNumber, 'Bill' as TypeDoc, 'RUR' as Currency, 'Our' as Owner, 100 as Quantity, 1000 as Nominal, 'Sell' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 37 as DealNumber, 'Coin' as TypeDoc, 'RUR' as Currency, 'Our' as Owner, 100 as Quantity, 25 as Nominal, 'Sell' as TypeDeal, to_date('29.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 25 as DealNumber, 'Coin' as TypeDoc, 'RUR' as Currency, 'Our' as Owner, 100 as Quantity, 25 as Nominal, 'Sell' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
)
select
xmlelement("TESTXML",
xmlagg(xmlelement("CURRENCY",
xmlattributes(lst.Currency as Currency),
xmlagg(xmlelement("OWNER",
xmlattributes(lst.owner as Owner),
xmlelement("TYPEDOC",
xmlattributes(lst.typedoc as TypeDoc),
xmlelement("RECORDS",
xmlattributes(lst.dealnumber as DealNumber,
lst.quantity as Quantity,
lst.nominal as Nominal,
lst.typedeal as TypeDeal,
to_char(lst.datedeal,'dd.mm.yyyy') as DateDeal)
)))))))
from lst
group by lst.dealnumber, lst.typedoc, lst.owner, lst.quantity, lst.nominal, lst.typedeal, lst.datedeal, lst.Currency;
В итоге получаю группировку по всем полям и файл не правильной структуры
XML
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58.
<TESTXML>
<CURRENCY CURRENCY="RUR">
<OWNER OWNER="Our">
<TYPEDOC TYPEDOC="Blank">
<RECORDS DEALNUMBER="1" QUANTITY="10" NOMINAL="1000" TYPEDEAL="Sell" DATEDEAL="30.04.2019"/>
</TYPEDOC>
</OWNER>
</CURRENCY>
<CURRENCY CURRENCY="RUR">
<OWNER OWNER="Our">
<TYPEDOC TYPEDOC="Bill">
<RECORDS DEALNUMBER="17" QUANTITY="100" NOMINAL="1000" TYPEDEAL="Sell" DATEDEAL="30.04.2019"/>
</TYPEDOC>
</OWNER>
</CURRENCY>
<CURRENCY CURRENCY="USD">
<OWNER OWNER="Our">
<TYPEDOC TYPEDOC="Blank">
<RECORDS DEALNUMBER="21" QUANTITY="10" NOMINAL="10" TYPEDEAL="Buy" DATEDEAL="30.04.2019"/>
</TYPEDOC>
</OWNER>
</CURRENCY>
<CURRENCY CURRENCY="RUR">
<OWNER OWNER="Not ours ">
<TYPEDOC TYPEDOC="Bill">
<RECORDS DEALNUMBER="23" QUANTITY="20" NOMINAL="100" TYPEDEAL="Buy" DATEDEAL="29.04.2019"/>
</TYPEDOC>
</OWNER>
</CURRENCY>
<CURRENCY CURRENCY="RUR">
<OWNER OWNER="Our">
<TYPEDOC TYPEDOC="Coin">
<RECORDS DEALNUMBER="25" QUANTITY="100" NOMINAL="25" TYPEDEAL="Sell" DATEDEAL="30.04.2019"/>
</TYPEDOC>
</OWNER>
</CURRENCY>
<CURRENCY CURRENCY="RUR">
<OWNER OWNER="Our">
<TYPEDOC TYPEDOC="Coin">
<RECORDS DEALNUMBER="37" QUANTITY="100" NOMINAL="25" TYPEDEAL="Sell" DATEDEAL="29.04.2019"/>
</TYPEDOC>
</OWNER>
</CURRENCY>
<CURRENCY CURRENCY="RUR">
<OWNER OWNER="Not ours">
<TYPEDOC TYPEDOC="Blank">
<RECORDS DEALNUMBER="65" QUANTITY="100" NOMINAL="1000" TYPEDEAL="Buy" DATEDEAL="30.04.2019"/>
</TYPEDOC>
</OWNER>
</CURRENCY>
<CURRENCY CURRENCY="USD">
<OWNER OWNER="Not ours">
<TYPEDOC TYPEDOC="Coin">
<RECORDS DEALNUMBER="72" QUANTITY="5" NOMINAL="1" TYPEDEAL="Sell" DATEDEAL="30.04.2019"/>
</TYPEDOC>
</OWNER>
</CURRENCY>
</TESTXML>
Если группировать только lst.Currency и убрать первый xmlagg на CURRENCY , то получаю два файла XML (по разным валютам) и снова не правильной структуры.
Запрос с группировкой только по Currency
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
with lst as(
select 1 as DealNumber, 'Blank' as TypeDoc, 'RUR' as Currency, 'Our' as Owner, 10 as Quantity, 1000 as Nominal, 'Sell' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 23 as DealNumber, 'Bill' as TypeDoc, 'RUR' as Currency, 'Not ours ' as Owner, 20 as Quantity, 100 as Nominal, 'Buy' as TypeDeal, to_date('29.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 72 as DealNumber, 'Coin' as TypeDoc, 'USD' as Currency, 'Not ours' as Owner, 5 as Quantity, 1 as Nominal, 'Sell' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 21 as DealNumber, 'Blank' as TypeDoc, 'USD' as Currency, 'Our' as Owner, 10 as Quantity, 10 as Nominal, 'Buy' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 65 as DealNumber, 'Blank' as TypeDoc, 'RUR' as Currency, 'Not ours' as Owner, 100 as Quantity, 1000 as Nominal, 'Buy' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 17 as DealNumber, 'Bill' as TypeDoc, 'RUR' as Currency, 'Our' as Owner, 100 as Quantity, 1000 as Nominal, 'Sell' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 37 as DealNumber, 'Coin' as TypeDoc, 'RUR' as Currency, 'Our' as Owner, 100 as Quantity, 25 as Nominal, 'Sell' as TypeDeal, to_date('29.04.2019','dd.mm.yyyy') as DateDeal from dual
union
select 25 as DealNumber, 'Coin' as TypeDoc, 'RUR' as Currency, 'Our' as Owner, 100 as Quantity, 25 as Nominal, 'Sell' as TypeDeal, to_date('30.04.2019','dd.mm.yyyy') as DateDeal from dual
)
select
xmlelement("TESTXML",
xmlelement("CURRENCY",
xmlattributes(lst.Currency as Currency),
xmlagg(xmlelement("OWNER",
xmlattributes(lst.owner as Owner),
xmlelement("TYPEDOC",
xmlattributes(lst.typedoc as TypeDoc),
xmlelement("RECORDS",
xmlattributes(lst.dealnumber as DealNumber,
lst.quantity as Quantity,
lst.nominal as Nominal,
lst.typedeal as TypeDeal,
to_char(lst.datedeal,'dd.mm.yyyy') as DateDeal)
))))))
from lst
group by lst.Currency
XML1 не верная структура
<TESTXML>
<CURRENCY CURRENCY="RUR">
<OWNER OWNER="Our">
<TYPEDOC TYPEDOC="Blank">
<RECORDS DEALNUMBER="1" QUANTITY="10" NOMINAL="1000" TYPEDEAL="Sell" DATEDEAL="30.04.2019"/>
</TYPEDOC>
</OWNER>
<OWNER OWNER="Not ours">
<TYPEDOC TYPEDOC="Blank">
<RECORDS DEALNUMBER="65" QUANTITY="100" NOMINAL="1000" TYPEDEAL="Buy" DATEDEAL="30.04.2019"/>
</TYPEDOC>
</OWNER>
<OWNER OWNER="Our">
<TYPEDOC TYPEDOC="Coin">
<RECORDS DEALNUMBER="37" QUANTITY="100" NOMINAL="25" TYPEDEAL="Sell" DATEDEAL="29.04.2019"/>
</TYPEDOC>
</OWNER>
<OWNER OWNER="Our">
<TYPEDOC TYPEDOC="Coin">
<RECORDS DEALNUMBER="25" QUANTITY="100" NOMINAL="25" TYPEDEAL="Sell" DATEDEAL="30.04.2019"/>
</TYPEDOC>
</OWNER>
<OWNER OWNER="Not ours ">
<TYPEDOC TYPEDOC="Bill">
<RECORDS DEALNUMBER="23" QUANTITY="20" NOMINAL="100" TYPEDEAL="Buy" DATEDEAL="29.04.2019"/>
</TYPEDOC>
</OWNER>
<OWNER OWNER="Our">
<TYPEDOC TYPEDOC="Bill">
<RECORDS DEALNUMBER="17" QUANTITY="100" NOMINAL="1000" TYPEDEAL="Sell" DATEDEAL="30.04.2019"/>
</TYPEDOC>
</OWNER>
</CURRENCY>
</TESTXML>
XML2 не верная структура
<TESTXML>
<CURRENCY CURRENCY="USD">
<OWNER OWNER="Our">
<TYPEDOC TYPEDOC="Blank">
<RECORDS DEALNUMBER="21" QUANTITY="10" NOMINAL="10" TYPEDEAL="Buy" DATEDEAL="30.04.2019"/>
</TYPEDOC>
</OWNER>
<OWNER OWNER="Not ours">
<TYPEDOC TYPEDOC="Coin">
<RECORDS DEALNUMBER="72" QUANTITY="5" NOMINAL="1" TYPEDEAL="Sell" DATEDEAL="30.04.2019"/>
</TYPEDOC>
</OWNER>
</CURRENCY>
</TESTXML>
Прошу помощи или совета в решение данной задачи.
|