如何按月份或年份计数和分组,月份为零

Posted

技术标签:

【中文标题】如何按月份或年份计数和分组,月份为零【英文标题】:How to count and group by month or years with month at zero 【发布时间】:2019-04-27 17:04:38 【问题描述】:

我正在尝试设置一个小型统计模块。 我正在寻找一个数组,其中包含每个月我的“晚宴”表的事件数。 通过下面的查询,我得到了结果,但前提是当月有结果。如果没有,则不会出现。 我的要求:

$data = DB::table("evenements")
        ->select(DB::raw('EXTRACT(MONTH FROM datedevenement) AS month, COUNT(id) as id'),
         DB::raw('ifnull(count(id),0) as id')
        )
         ->where('typeevenement_id', '1')
        ->whereYear('datedevenement', Carbon::now()->year)
        ->orderBy('datedevenement')

        ->groupBy(DB::raw('month'))
        ->get();



    return $data;

我的晚宴桌:

id | datedevenement | typeevenement_id

我明白我的请求不能创造不存在的月份。我想知道 carbon 或 laravel 是否没有按月或按年连续列出的内容。

结果必须是带有monthORyears->count(evenement)的数组或集合

【问题讨论】:

【参考方案1】:

最简单的事情可能是做一个 foreach 几个月并将它与集合冲突,如果不存在添加它。

为简单起见,您可以应用方法 keyby() (documentation)

->keyBy('month')

在您的收藏中。

然后像这样执行foreach:

$months =["January", "February", ....]; 
foreach ($months as $month)
  if (!isset($data[$month]))
    $data[$month]['id'] = 0;
  

【讨论】:

【参考方案2】:

我喜欢克劳迪奥的回答,但我会尝试另一种方式。

首先,我收集了我的事件:

$temp = $model
             ->orderBy("date_field")
             ->get()
             ->groupBy(function($query)  
                 return Carbon::parse($query->date_field)
                               ->format("m");
             )

现在,您有一个按月分组的集合。

我的第二步是像这样迭代集合$temp

$result = new array();
$temp->each(function($query) use (&$result) 
    $result["count"] = $query->count();
    $result["data"] = $query;
);

现在,您有一个数组,其中包含一个用于探索您的数据的集合和一个用于了解每月将实现多少事件的计数器。当您没有事件时,有必要对您的前端进行消毒。

希望对你有所帮助。

参考: https://laraveldaily.com/laravel-group-query-result-by-day-month-year/

【讨论】:

【参考方案3】:

谢谢你。 有了这 2 个答案和一个小的 serach,我就来到了这个解决方案(我已经添加了 somathing 以当月作为起点):

$monthly_uploaded_product = Evenement::select(DB::raw('COUNT(id) as total, EXTRACT(MONTH FROM datedevenement) AS month')
    )
        ->where('typeevenement_id', '1')
        ->wheredate('datedevenement', '>=', Carbon::now()->lastOfMonth()->subyears(1))
       /// ->whereYear('datedevenement', Carbon::now()->year)
       ->groupBy(DB::raw('month'))

        ->get();

    $mois  = ["janvier", "fevrier", "mars", "avril", "mai", "juin", "juillet", "aout", "septembre", "octobre", "novembre", "decembre"];

    foreach ($mois as $mois99) 
        $arriveeparmoisrefuge[]= array(
            'mois' => $mois99,
            'total' => '0'
        );

    
        foreach ($monthly_uploaded_product as $key) 
                $arriveeparmoisrefuge[$key->month - 1]['total'] = $key->total;//update each month with the total value
        
    $sorted = collect($arriveeparmoisrefuge)->sortBy(function ($count, $month) 
        $currentMonth = (int) \Carbon\Carbon::now()->month;

        return ($month + (13 - $currentMonth - 1)) % 12;
    );

    return  $sorted;

【讨论】:

以上是关于如何按月份或年份计数和分组,月份为零的主要内容,如果未能解决你的问题,请参考以下文章

选择按month.year分组的两个日期之间的用户计数,并且对于count = 0的月份包括零

Highcharts:使用 JSON 数据创建多个系列,将我的月份和年份分组

Laravel 仅按日期分组并获取计数

PostgreSQL 按纪元月分组

iOS 核心数据总和数据按日期、月份年份

通过一个 select 语句使用两个 group by