【问题标题】:Laravel raw query that counts results per month and aggregatesLaravel 原始查询,每月计算结果并聚合
【发布时间】:2017-12-29 12:40:10
【问题描述】:

我有以下问题

$this->builder = (DB::table('sales')
        ->select(DB::raw('DATE_FORMAT(sale_date, "%M") as sale_date'), DB::raw('count(*) as sales'))
        ->where('sale_date', '>', $lookback->toDateTimeString())
        ->orderBy('sale_date', 'asc')
        ->groupBy('sale_date'));

尽管指定了月份 %M 来对结果进行分组,但它只是计算每个日期并将标签作为月份,因此如下所示:

sale_date , sales
 August   ,  1
 August   ,  3
 August   ,  2

而不是我所期望的:

sale_date , sales
 August   ,  6

我在这里做错了什么,一旦我从 API 获得结果,我确实可以选择只在 javascript 中求和,但是我认为没有必要对吗?

【问题讨论】:

    标签: mysql laravel laravel-5


    【解决方案1】:

    尝试按DATE_FORMAT(sale_date, "%M") 分组,您已分配名为sale_date 的别名,这也是您的列的名称,因此请尝试为您的别名使用不同的名称或将完整的表达式放入分组中

    $this->builder = (DB::table('sales')
            ->select(DB::raw('DATE_FORMAT(sale_date, "%M") as sale_month'), DB::raw('count(*) as sales'))
            ->where('sale_date', '>', $lookback->toDateTimeString())
            ->orderBy('sale_date', 'asc')
            ->groupBy('sale_month'));
    

    不确定DB::raw() 是否适用于groupBy()

    ->groupBy(DB::raw('DATE_FORMAT(sale_date, "%M")'))
    

    【讨论】:

    • 是的,DB::raw 的 groupBy 有效 - 感谢我唯一没有尝试过的事情 :)
    【解决方案2】:

    另一种解决方案是:

      $this->builder = (DB::table('sales')
        ->select(DB::raw('DATE_FORMAT(sale_date, "%M") as sale_month'),
         DB::raw('sum(count) as sales'))
        ->where('sale_date', '>', $lookback->toDateTimeString())
        ->orderBy('sale_date', 'asc')
        ->groupBy('sale_month'));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      相关资源
      最近更新 更多