2016-12-28 3 views
1

Ich versuche, die Abteilungen mit den meisten Beschäftigten (und die Zahl der Mitarbeiter) in dem folgende XML-Dokument zu finden:findet die Abteilungen mit den meisten Beschäftigten in XQuery

<organization> 
    <departements> 
     <dept id="d1"> 
      <name>accounting</name> 
     </dept> 
     <dept id="d2"> 
      <name>marketing</name> 
     </dept> 
     <dept id="d3"> 
      <name>production</name> 
     </dept> 
    </departements> 
    <employees> 
     <emp id="e1"> 
      <name>...</name> 
      <activities> 
       <activity ref="d1"/> 
      </activities> 
     </emp> 
     <emp id="e2"> 
      <name>...</name> 
      <activities> 
       <activity ref="d2"/> 
       <activity ref="d3"/> 
      </activities> 
     </emp> 
     <emp id="e3"> 
      <name>...</name> 
      <activities> 
       <activity ref="d3"/> 
      </activities> 
     </emp> 
     <emp id="e4"> 
      <name>...</name> 
      <activities> 
       <activity ref="d2"/> 
      </activities> 
     </emp> 
    </employees> 
</organization> 

Hier ist, was ich versucht habe:

(for $dept in doc('emp_dept.xml') //dept 
let $nbr := count(doc('emp_dept.xml')//activity[@ref = $dept/@id]) 
order by $nbr descending 
return $dept) [1] 

die obige Abfrage gibt die folgende Ausgabe:

<dept id="d2"> 
    <name>marketing</name> 
</dept> 

ich möchte bekommen die folgende Ausgabe:

<dept id="d2"> 
    <name>marketing</name> 
    <employees>2</employees> 
</dept> 
<dept id="d3"> 
    <name>production</name> 
    <employees>2</employees> 
</dept> 

Antwort

1

Sie könnte erstellen, um die dept Elemente, die Sie ausgeben möchten, die höchste Zahl der Mitarbeiter bestimmen, und dann ausgegeben diejenigen, die diese max Zahl entsprechen.

Ich bin sicher, dass es einen effizienteren Weg gibt, aber das ist, was zuerst in den Sinn kam.

let $doc := doc('emp_dept.xml') 
let $newDept := for $dept in $doc//dept 
    return 
     <dept>{$dept/@*,$dept/*, 
     <employees>{count($doc//emp[activities/activity/@ref=$dept/@id])}</employees> 
     }</dept> 
let $maxEmployees := max($newDept/employees) 
return 
    $newDept[employees=$maxEmployees] 
+0

vielen Dank. es funktioniert wie ein Zauber. – user7233170

Verwandte Themen