【问题标题】:Laravel: write query to count sales with group by weeksLaravel:编写查询以按周分组统计销售额
【发布时间】:2021-12-30 11:17:39
【问题描述】:

我的 mysql 数据库有一个销售表,代表每天销售的产品列表,其中包含产品名称、价格和 created_at 列。例如,我可以通过这样做获得某一天的销售数量;

$sales = Sale::where('created_at', $certain_day')->count();

但是,我需要跟踪几周的每周销售量,比如从本周(星期日)开始到今天为止销售的产品数量、上周的销售数量、两周的销售数量以此类推,在过去五周内,以数组形式返回(类似于:[{30/12/2021: 10}, {25/12/2021: 15}, {18/12/2021: 22} ]. 我如何编写 laravel 雄辩的查询来实现这一点?

【问题讨论】:

标签: mysql laravel eloquent


【解决方案1】:

试试这样的:

$from = date('2018-01-01');
$to = date('2018-05-02');

Sale::whereBetween('created_at', [$from, $to])->get();

然后你可以使用 Carbon 方法来计算本周、前一周、下周

Sale::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])->get();

@更新

Sale::selectRaw('*,UNIX_TIMESTAMP(created_at) DIV '.$sec. ' as group_date')->groupBy('group_date');

你可以做的周、月和日

->groupBy(function($data) {
// day
return Carbon::parse($data->created_at)->format('Y-m-d');
//month
return Carbon::parse($data->created_at)->format('Y-m');
//week
return Carbon::parse($data->created_at)->format('W');
})

【讨论】:

  • 谢谢..这仅返回一周的记录。我想要的是显示过去五周中每周的销售计数的记录,即本周、上周、2 周前等等,所有这些都在一个查询中返回
  • SELECT * FROM sales WHERE created_at BETWEEN (NOW() - INTERVAL 7 DAY) AND NOW() 你能不能直接在数据库中试试这个,如果你得到想要的记录,那么我会帮助你在 laravel 中改造
  • 谢谢。但这只会返回上周的记录。如果我能解释一下,我想要过去几周的每一周的记录,每周分组,而不仅仅是一周。更像是说我想要在一个查询中返回本周、上周、最后两周等的销售记录。 (我真正想要的是每周的记录数)
  • 我认为你应该试试这个: Sale::selectRaw('*,UNIX_TIMESTAMP(created_at) DIV '.$sec.' as group_date')->groupBy('group_date');对于周、月和日,您可以执行 ->groupBy(function($data) { // 日返回 Carbon::parse($data->created_at)->format('Y-m-d'); // 月返回Carbon::parse($data->created_at)->format('Y-m'); //周返回 Carbon::parse($data->created_at)->format('W'); })跨度>
  • 更新了我的答案@Flexi
【解决方案2】:

以下查询为您提供过去 5 周的每周销售额:

SELECT FROM_DAYS(TO_DAYS(created_at) - MOD(TO_DAYS(created_at), -1, 7)) AS weeklyGrouping , COUNT(*) AS sales_count
FROM sales
GROUP BY weeklyGrouping
ORDER BY weeklyGrouping DESC
LIMIT 5

上面的公式假定星期日是一周的第一天,如果您的星期从星期一开始,请将 -1 更改为 -2。

有关描述性信息,您可以参考this article

EDIT(Eloquent 查询构建器风格)

$sales = Sale::selectRaw('COUNT(*) AS sales_count')
    ->selectRaw('FROM_DAYS(TO_DAYS(created_at) - MOD(TO_DAYS(created_at), -1, 7)) AS weeklyGrouping')
    ->groupBy('weeklyGrouping')
    ->orderBy('weeklyGrouping', 'DESC')
    ->take(5);

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    相关资源
    最近更新 更多