XML/XQuery/group

Материал из Web эксперт
Перейти к: навигация, поиск

Grouping by department

File: Data.xml
<inventory id="inv0001" date="2008-12-19" loc="USA">
  <car model="A" id="0001" quantity="1" color="navy"/>
  <car model="B" id="0002" quantity="1"/>
  <car model="B" id="0003" quantity="2"/>
  <car model="C" id="0004" quantity="1" color="white"/>
  <car model="A" id="0001" quantity="1" color="black"/>
</inventory>


File: Query.xquery
for $d in distinct-values(doc("Data.xml")//car/@model)
let $cars := doc("Data.xml")//car[@model = $d]
order by $d
return <department code="{$d}">{
         for $i in $cars
         order by $i/@id
         return $i
       }</department>

Output:
<?xml version="1.0" encoding="UTF-8"?>
<department code="A">
   <car model="A" id="0001" quantity="1" color="navy"/>
   <car model="A" id="0001" quantity="1" color="black"/>
</department>
<department code="B">
   <car model="B" id="0002" quantity="1"/>
   <car model="B" id="0003" quantity="2"/>
</department>
<department code="C">
   <car model="C" id="0004" quantity="1" color="white"/>
</department>



Grouping in XQuery

File: Data.xml
<!-- car order docuCt -->
<order>
  <car dept="A">
    <number>1</number>
    <name>name 1</name>
  </car>
  <car dept="B">
    <number>2</number>
    <name>name 2</name>
  </car>
  <car dept="B">
    <number>3</number>
    <name>name 3</name>
  </car>
  <car dept="C">
    <number>4</number>
    <name>name 4</name>
  </car>
</order>

File: Query.xquery
for $d in distinct-values(doc("Data.xml")//car/@dept)
return 
  <result dept="{$d}" 
          count="{count(doc("Data.xml")//car[@dept = $d])}"/>

Output:
<?xml version="1.0" encoding="UTF-8"?>
<result count="1" dept="A"/>
<result count="2" dept="B"/>
<result count="1" dept="C"/>