Laravel原始查询,用于计算每月的结果和聚合

问题描述 投票:4回答:2

我有以下查询

$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
2个回答
3
投票

通过DATE_FORMAT(sale_date, "%M")尝试组,您已经分配了名为sale_date的别名,它也是您的列的名称,因此请尝试为别名使用不同的名称或将完整表达式放入group by

$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")'))

0
投票

另一个解决方案是:

  $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'));
© www.soinside.com 2019 - 2024. All rights reserved.