如何用 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_idsum(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_idsum(price_points)

$sumPricePointsQuery = DB::table('template_sales')
                       ->select('session_id', DB::raw('SUM(price_points) as sum_price_points'))
                       ->groupBy('session_id');

现在我们需要得到 sum_spent_pointssum_price_points 的加法。这次我们的表将是我们从子查询中获得的结果。所以我们可以使用 Laravel 的 fromSubjoinSub 来得到我们想要的结果。

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 ;

希望这能让你朝着正确的方向前进。