获取上个月的记录

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

我需要获取上个月的客户ID,数量和订单数量。

Paper::select('customer_id', DB::raw('SUM(price) as `sum`')
    ,DB::raw('COUNT(*) as `orders_per_month`'))
    ->where('created_at', '>=', Carbon::now()->startOfMonth())
    ->groupBy('customer_id')->get()

我尝试过,但是如果客户上个月没有订单,将不会选择它

php mysql sql laravel eloquent
2个回答
1
投票

尝试凉粉:

DB::raw('COALESCE(COUNT(*), 0) as `orders_per_month`')

此函数允许您定义默认值,否则为NULL。

http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_coalesce

更新:

我想,如果您只选择上个月订购的客户,那么绝对没有订单就不会吸引那些客户。您可以通过类似的方法实现所需的内容:

mysql> select * from cu; +----+----------+ | id | name | +----+----------+ | 1 | Google | | 2 | Yahoo | | 3 | Mirosoft | +----+----------+ 3 rows in set (0.00 sec) mysql> select * from so; +----+-------------+---------------------+-------+ | id | customer_id | created_at | price | +----+-------------+---------------------+-------+ | 1 | 1 | 2016-08-23 12:12:12 | 2 | | 2 | 1 | 2016-09-24 12:14:13 | 3 | | 3 | 2 | 2016-09-25 00:00:00 | 5 | | 4 | 2 | 2016-09-12 09:00:00 | 3 | +----+-------------+---------------------+-------+ 4 rows in set (0.00 sec) mysql> select cu.id as customer_id, coalesce(sum(so.price),0) as total, coalesce(count(so.customer_id),0) as orders_per_month from cu left join so on (cu.id = so.customer_id) where so.created_at >= '2016-09-01 00:00:00' or so.created_at is null group by cu.id; +-------------+-------+------------------+ | customer_id | total | orders_per_month | +-------------+-------+------------------+ | 1 | 3 | 1 | | 2 | 8 | 2 | | 3 | 0 | 0 | +-------------+-------+------------------+ 3 rows in set (0.00 sec)

但是,结果查询不是一种高效的方法,您将不得不扫描所有客户并加入以获得没有订单的客户。分别获取有订单和无订单的客户列表并与UNION或通过您的应用程序代码合并,可能会更快。

mysql> select customer_id, sum(total) as total, sum(orders_per_month) as orders_per_month from (select id as customer_id, 0 as total, 0 as orders_per_month from cu union all select customer_id, sum(so.price) as total, count(so.customer_id) as orders_per_month from so where created_at >= '2016-09-01 00:00:00'group by customer_id) agg group by customer_id; +-------------+-------+------------------+ | customer_id | total | orders_per_month | +-------------+-------+------------------+ | 1 | 3 | 1 | | 2 | 8 | 2 | | 3 | 0 | 0 | +-------------+-------+------------------+ 3 rows in set (0.00 sec)

尝试一下

Paper::select('customer_id', DB::raw('SUM(price) as `sum`'), DB::raw('COUNT(*) as `orders_per_month`') ) ->whereMonth('created_at', Carbon('first day of last month')->month) ->whereYear('created_at', Carbon('first day of last month')->year) ->groupBy('customer_id')->get()


1
投票
尝试一下
© www.soinside.com 2019 - 2024. All rights reserved.