v_divide
parent
2b9454371a
commit
926c21e253
38
olap.php
38
olap.php
|
@ -16,6 +16,7 @@ class OLAP
|
|||
{
|
||||
static $sources;
|
||||
static $current_srcid, $current_src;
|
||||
static $current_spec;
|
||||
static $functions = array(
|
||||
'year' => array('name' => 'Год', 'time_format' => 'Y', 'sql' => 'SUBSTR($,1,4)'),
|
||||
'month' => array('name' => 'Месяц', 'time_format' => 'Y-m', 'sql' => 'SUBSTR($,1,7)'),
|
||||
|
@ -27,14 +28,14 @@ class OLAP
|
|||
'second' => array('name' => 'Секунда', 'time_format' => 'H:i:s', 'sql' => 'DATE_FORMAT($, "%k:%i:%s")'),
|
||||
);
|
||||
static $aggregates = array(
|
||||
'count' => array('name' => 'Количество', 'sql' => 'COUNT($)'),
|
||||
'sum' => array('name' => 'Сумма', 'sql' => 'SUM($)'),
|
||||
'avg' => array('name' => 'Среднее', 'sql' => 'AVG($)'),
|
||||
'min' => array('name' => 'Минимум', 'sql' => 'MIN($)'),
|
||||
'max' => array('name' => 'Максимум', 'sql' => 'MAX($)'),
|
||||
'stddev' => array('name' => 'Дисперсия', 'sql' => 'STDDEV($)'),
|
||||
'n_uniq' => array('name' => 'Количество уникальных', 'sql' => 'COUNT(DISTINCT $)'),
|
||||
# 'equally' => array('name' => '', ),
|
||||
'count' => array('name' => 'Количество', 'sql' => 'COUNT($)'),
|
||||
'sum' => array('name' => 'Сумма', 'sql' => 'SUM($)'),
|
||||
'avg' => array('name' => 'Среднее', 'sql' => 'AVG($)'),
|
||||
'min' => array('name' => 'Минимум', 'sql' => 'MIN($)'),
|
||||
'max' => array('name' => 'Максимум', 'sql' => 'MAX($)'),
|
||||
'stddev' => array('name' => 'Дисперсия', 'sql' => 'STDDEV($)'),
|
||||
'n_uniq' => array('name' => 'Количество уникальных', 'sql' => 'COUNT(DISTINCT $)'),
|
||||
'v_divide' => array('name' => 'Сумма поровну на поле по вертикали', 'cell_only' => true),
|
||||
);
|
||||
static $specf = array(
|
||||
'v_field', 'v_func', 'h_field', 'h_func',
|
||||
|
@ -120,8 +121,12 @@ class OLAP
|
|||
exit;
|
||||
}
|
||||
|
||||
self::$current_spec = array();
|
||||
foreach(self::$specf as $x)
|
||||
{
|
||||
$$x = $request[$x];
|
||||
self::$current_spec[$x] = $request[$x];
|
||||
}
|
||||
|
||||
$fields = array();
|
||||
$options = array('GROUP BY' => array());
|
||||
|
@ -163,7 +168,7 @@ class OLAP
|
|||
if ($cell_group_field !== '')
|
||||
$v = &$v[$r['cell_group_field']];
|
||||
if ($do_aggr)
|
||||
call_user_func_array('self::aggr_update_'.$cell_aggr, array(&$v, &$r['cell_field']));
|
||||
call_user_func_array('self::aggr_update_'.$cell_aggr, array(&$v, &$row));
|
||||
else
|
||||
$v = $r['cell_field'];
|
||||
$hkeys[$r['h_field']] = 1;
|
||||
|
@ -174,12 +179,12 @@ class OLAP
|
|||
if ($cell_group_field !== '')
|
||||
foreach ($group as $i => &$r)
|
||||
foreach ($r as $j => &$c)
|
||||
call_user_func_array('self::aggr_finish_'.$cell_aggr, array(&$c));
|
||||
call_user_func_array('self::aggr_finish_'.$cell_aggr, array(&$c, $i, $j));
|
||||
else
|
||||
foreach ($group as $i => &$r)
|
||||
foreach ($r as $j => &$c)
|
||||
foreach ($c as $k => &$g)
|
||||
call_user_func_array('self::aggr_finish_'.$cell_aggr, array(&$g));
|
||||
call_user_func_array('self::aggr_finish_'.$cell_aggr, array(&$g, $i, $j, $k));
|
||||
}
|
||||
|
||||
if ($v_field !== '' && $v_sort_aggr !== '' && $v_sort_field !== '')
|
||||
|
@ -305,5 +310,14 @@ class OLAP
|
|||
|
||||
/* Агрегатные функции и преобразования */
|
||||
|
||||
static function aggr_update_distinct(&$d, &$v) { $d[$v]++; }
|
||||
static $divn = array();
|
||||
static function aggr_update_v_divide(&$d, &$row)
|
||||
{
|
||||
$d += $row['cell_field'];
|
||||
self::$divn[$row['v_field']][$row['cell_group_field']]++;
|
||||
}
|
||||
static function aggr_finish_v_divide(&$d, $vk, $hk, $ck = NULL)
|
||||
{
|
||||
$d /= self::$divn[$vk][$ck]++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,8 +28,10 @@
|
|||
<select style="width:100px" name="h_sort_aggr">
|
||||
<option value="">по значениям поля</option>
|
||||
<!-- FOR f = aggregates -->
|
||||
<!-- IF NOT f.cell_only -->
|
||||
<option value="{s f.id}"<!-- IF eq(h_sort_aggr, f.id) --> selected<!-- END -->>{s f.name} другого поля:</option>
|
||||
<!-- END -->
|
||||
<!-- END -->
|
||||
</select>
|
||||
<!-- SET fld = 'h_sort' --><!-- INCLUDE admin_olap_field.tpl -->
|
||||
</td></tr>
|
||||
|
@ -44,8 +46,10 @@
|
|||
<select style="width:100px" name="v_sort_aggr">
|
||||
<option value="">по значениям поля</option>
|
||||
<!-- FOR f = aggregates -->
|
||||
<!-- IF NOT f.cell_only -->
|
||||
<option value="{s f.id}"<!-- IF eq(v_sort_aggr, f.id) --> selected<!-- END -->>{s f.name} другого поля:</option>
|
||||
<!-- END -->
|
||||
<!-- END -->
|
||||
</select>
|
||||
<!-- SET fld = 'v_sort' --><!-- INCLUDE admin_olap_field.tpl -->
|
||||
</td><td style="background-color: #ffe0e0; padding: 8px">
|
||||
|
|
Loading…
Reference in New Issue