我有一个函数可以返回项目总数(y)的数据集,我需要从这个结果中获得百分比。所以我需要
(y / SUM(y)) * 100)
结果集中所有y的总和超过一个。
这是我的功能:
public function getVisitsByClients($filters = [])
{
$query = $this->filtersRepository->unionAllSources(function ($table) use ($filters) {
return DB::connection('customer')->table($table)->selectRaw('visit_last_action_time, config_device_type');
}, null, 'visit', $filters);
$this->filterByDate($query, $filters);
if ($query) {
$totalSumQuery = DB::table(DB::raw("({$query->toSql()}) as visits"))->selectRaw('COUNT(*)');
$result = DB::connection('customer')
->table(DB::raw("({$query->toSql()}) as visits"))
->selectRaw("config_device_type name, COUNT(*) y, COUNT(*)/({$totalSumQuery->toSql()})*100 percentage")
->groupBy('config_device_type');
return $result->get();
} else {
return [];
}
}
但是当我运行这个时,我收到了这个错误:
SQLSTATE[HY000]: General error: 2031
如果我删除过滤器,它可以工作:
$this->filterByDate($query, $filters);
但我需要这个过滤器,它是一个日期数组(开始和结束)。没有过滤器,我得到错误的百分比,因为它正在计算所有y的y /总和,而不仅仅是在给定的日期框架中。
修改
这是我的filterByDate
功能:
private function filterByDate($query, $filters, $field = 'visit_last_action_time')
{
if (!empty($filters['start'])) {
$query->where($field, '>=', $filters['start']);
}
if (!empty($filters['end'])) {
$query->where($field, '<=', $filters['end']);
}
}
例如......如果没有过滤器,我会有55/12000 * 100,但如果我选择2017-10-10和2017-10-20之间的日期范围,我有55/4000 * 100。 ..这就是我错误百分比的原因。