如何用 eloquent Laravel 得到两个表和组响应的总和?
how to get total sum of two tables and group responses with eloquent Laravel?
我正在尝试使用 eloquent 创建一个查询,我需要知道通过 id、用户名和 session_id 求和的总分。
但是我得到的结果不正确。
我的代码
$query = DB::table('advisors')
->select('advisors.id','advisors.nombre_comercial','session_details.session_id',
DB::raw('SUM(session_details.spent_points + template_sales.price_points) AS suma_total'))
->join('consultancy_requests','advisors.id','=','consultancy_requests.advisor_id')
->whereBetween('consultancy_requests.created_at',[$from,$to])
->join('receipts','consultancy_requests.id','=','receipts.session_id')
->where('receipts.status',NULL)
->whereBetween('receipts.created_at',[$from,$to])
->join('session_details','consultancy_requests.consultancy_id','=','session_details.session_id')
->whereBetween('session_details.created_at',[$from,$to])
->join('template_sales','session_details.session_id','=','template_sales.session_id')
->whereBetween('template_sales.created_at',[$from,$to])
->groupBy('advisors.id','advisors.nombre_comercial','session_details.session_id')
->get();
代码回复
session_details table
template_sales table
这是我想要得到的正确答案。
我注意到您的查询中有几个错误。例如,您不需要 SUM (session_details.spent_points + template_sales.price_points)
因为这已经在执行加法了。
与其指出所有这些,不如将您的问题分解成更小的部分;当查询看起来很复杂时,最好将其分解以便更好地理解。似乎有几个表格,但我将根据提供的两个表格回答,这应该给你一个起点。
本质上,你想要的是,
每session_id
得到spent_points
的总和;所以你需要 group by session_id
和 sum(spent_points)
$sumSpentPointsQuery = DB::table('session_details')
->select('session_id', DB::raw('SUM(spent_points) as sum_spent_points'))
->groupBy('session_id');
每session_id
得到price_points
的总和;所以你需要 group by session_id
和 sum(price_points)
$sumPricePointsQuery = DB::table('template_sales')
->select('session_id', DB::raw('SUM(price_points) as sum_price_points'))
->groupBy('session_id');
现在我们需要得到 sum_spent_points
和 sum_price_points
的加法。这次我们的表将是我们从子查询中获得的结果。所以我们可以使用 Laravel 的 fromSub
和 joinSub
来得到我们想要的结果。
DB::query()
->select('ssp.session_id as session_id', DB::raw('sum_spent_points + sum_price_points as suma_total') )
->fromSub($sumSpentPointsQuery, 'ssp')
->joinSub($sumPricePointsQuery, 'spp', function($join){
$join->on('ssp.session_id', '=', 'spp.session_id');
})->get();
此查询应生成表示此的 sql:
select ssp.session_id as session_id, (sum_spent_points + sum_price_points) as suma_total
from
(select session_id, sum(spent_points) as sum_spent_points
from session_details group by session_id) ssp
inner join
(select session_id, sum(price_points) as sum_price_points
from template_sales group by session_id) spp
on ssp.session_id = spp.session_id ;
希望这能让你朝着正确的方向前进。
我正在尝试使用 eloquent 创建一个查询,我需要知道通过 id、用户名和 session_id 求和的总分。 但是我得到的结果不正确。
我的代码
$query = DB::table('advisors')
->select('advisors.id','advisors.nombre_comercial','session_details.session_id',
DB::raw('SUM(session_details.spent_points + template_sales.price_points) AS suma_total'))
->join('consultancy_requests','advisors.id','=','consultancy_requests.advisor_id')
->whereBetween('consultancy_requests.created_at',[$from,$to])
->join('receipts','consultancy_requests.id','=','receipts.session_id')
->where('receipts.status',NULL)
->whereBetween('receipts.created_at',[$from,$to])
->join('session_details','consultancy_requests.consultancy_id','=','session_details.session_id')
->whereBetween('session_details.created_at',[$from,$to])
->join('template_sales','session_details.session_id','=','template_sales.session_id')
->whereBetween('template_sales.created_at',[$from,$to])
->groupBy('advisors.id','advisors.nombre_comercial','session_details.session_id')
->get();
代码回复
session_details table
template_sales table
这是我想要得到的正确答案。
我注意到您的查询中有几个错误。例如,您不需要 SUM (session_details.spent_points + template_sales.price_points)
因为这已经在执行加法了。
与其指出所有这些,不如将您的问题分解成更小的部分;当查询看起来很复杂时,最好将其分解以便更好地理解。似乎有几个表格,但我将根据提供的两个表格回答,这应该给你一个起点。
本质上,你想要的是,
每session_id
得到spent_points
的总和;所以你需要 group by session_id
和 sum(spent_points)
$sumSpentPointsQuery = DB::table('session_details')
->select('session_id', DB::raw('SUM(spent_points) as sum_spent_points'))
->groupBy('session_id');
每session_id
得到price_points
的总和;所以你需要 group by session_id
和 sum(price_points)
$sumPricePointsQuery = DB::table('template_sales')
->select('session_id', DB::raw('SUM(price_points) as sum_price_points'))
->groupBy('session_id');
现在我们需要得到 sum_spent_points
和 sum_price_points
的加法。这次我们的表将是我们从子查询中获得的结果。所以我们可以使用 Laravel 的 fromSub
和 joinSub
来得到我们想要的结果。
DB::query()
->select('ssp.session_id as session_id', DB::raw('sum_spent_points + sum_price_points as suma_total') )
->fromSub($sumSpentPointsQuery, 'ssp')
->joinSub($sumPricePointsQuery, 'spp', function($join){
$join->on('ssp.session_id', '=', 'spp.session_id');
})->get();
此查询应生成表示此的 sql:
select ssp.session_id as session_id, (sum_spent_points + sum_price_points) as suma_total
from
(select session_id, sum(spent_points) as sum_spent_points
from session_details group by session_id) ssp
inner join
(select session_id, sum(price_points) as sum_price_points
from template_sales group by session_id) spp
on ssp.session_id = spp.session_id ;
希望这能让你朝着正确的方向前进。