master
vitalif 2010-07-28 22:19:38 +00:00
parent 2b9454371a
commit 926c21e253
2 changed files with 30 additions and 12 deletions

View File

@ -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]++;
}
}

View File

@ -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">