declare function local:getMinsSecs($mins, $ttc){
let $mmts := floor($mins div $ttc)
let $para := substring(substring-after(string(round-half-to-even(($mins div $ttc) - $mmts, 5)), '.'), 1, 3)
let $pen := if($para != '') then number($para) else 0
let $tm := string(round($pen * 0.06))
return concat(if($mmts < 10) then concat('0', $mmts)
else xs:decimal($mmts),
':',
if($tm < 10) then concat('0', $tm)
else $tm)
};
declare function local:getHHMMSSFromNumber($num as xs:integer){
let $tm := xs:integer($num mod 60)
let $mla := xs:integer($num div 60)
let $mmts := xs:integer($mla mod 60)
let $hh := xs:integer($mla div 60)
let $hhFinal := if(string-length(xs:string($hh)) >= 2) then $hh
else (concat('0', $hh))
let $mmFinal := if(string-length(xs:string($mmts)) >= 2) then $mmts
else (concat('0', $mmts))
let $ssFinal := if(string-length(xs:string($tm)) >= 2) then $tm
else (concat('0', $tm))
return concat($hhFinal, ':', $mmFinal, ':', $ssFinal)
};
declare function local:getMinutesFromDutation($duration as xs:string){
let $duration := tokenize($duration, ":")
let $hh := $duration[1]
let $mmts := $duration[2]
let $tm := $duration[3]
return xs:decimal(round-half-to-even(number(data($hh)) * 60 + number(data($mmts)) + (number(data($tm)) div 60), 3))
};
declare function local:getAWD() {
for $details in (collection("E:\Web-Projects\VodafoneUK\Docs\Cloud_Test_Stats\Performance_Analysis\Freq_Called_Sample_XML_Data.xml")/
SUBCUSTBRK[AN[@NO = (987654321)]][DOB >='2014-04-01'
and DOB <= '2015-03-31']/CNOS/ROW)
let $nai := upper-case(data($details/@AR))
let $nc := data($details/@NO)
group by $nai, $nc
let $sd := xs:integer(sum($details/@DR))
let $noo := sum($details/@CLS)
let $rta := sum($details/@AT)
let $dut := local:getHHMMSSFromNumber($sd)
let $mst := local:getMinutesFromDutation($dut)
let $cpd := if($mst > 0 and $noo > 0)
then xs:decimal(round-half-to-even($mst div $noo, 2))
else 0.00
let $rch := xs:decimal(round-half-to-even($rta, 3))
let $cpc := if($rch > 0 and $noo > 0)
then xs:decimal(round-half-to-even($rch div $noo, 3))
else 0.00
let $cpm := if($rch > 0 and $mst > 0)
then xs:decimal(round-half-to-even($rch div $mst, 3))
else 0.00
where $noo > 0
order by $noo descending
return
{ $nai }
{ $nc}
{ xs:decimal($noo) }
{ $dut }
{ $mst }
{ $rch }
{ $cpc }
{ $cpm }
{ $sd }
};
let $ceodata := local:getAWD()[position() le 10000]
let $pan := xs:decimal(sum($ceodata/CALLS))
let $dut := local:getHHMMSSFromNumber(xs:integer(sum($ceodata/SEC)))
let $tatu := local:getMinutesFromDutation($dut)
let $pm := if($tatu > 0 and $pan > 0)
then xs:decimal(round-half-to-even($tatu div $pan, 2))
else 0.00
let $my := sum($ceodata/CHRG)
let $rch := xs:decimal(round-half-to-even($my, 3))
let $cpc := if($rch > 0 and $pan > 0)
then xs:decimal(round-half-to-even($rch div $pan, 3))
else 0.00
let $cpm := if($rch > 0 and $tatu > 0)
then xs:decimal(round-half-to-even($rch div $tatu, 3))
else 0.00
return
(if(count($ceodata) > 0) then
(for $eachRow in $ceodata
let $om := $eachRow/CHRG[1]
let $op := $eachRow/CALLS[1]
let $as := if($op > 0 and $pan > 0)
then xs:decimal(round-half-to-even(($op div $pan) * 100, 3))
else 0.00
let $pop := if($om > 0 and $my > 0)
then xs:decimal(round-half-to-even(($om div $my) * 100, 3))
else 0.00
return
{
$eachRow[1]/node(),
{ $pop }
}
,
Total
{ xs:decimal($pan) }
{ $dut }
{ $tatu }
{ format-number($rch, '0.000') }
{ format-number($cpc, '0.000') }
{ format-number($cpm, '0.000') }
100.000
)
else ())