我需要获取添加到交易中的管理员总和。交易被分成多个表,现在我想分别从两个表中获取总计。最终我得到的结果高得离谱。我不确定我的查询是否在某处乘以该值。
User::select('user.name as name',
DB::raw('sum(CASE WHEN current.amount > 0 THEN current.amount END) as current_positive'),
DB::raw('sum(CASE WHEN current.amount < 0 THEN current.amount END) as current_negative'),
DB::raw('sum(CASE WHEN cash.amount > 0 THEN cash.amount END) as cash_positive'),
DB::raw('sum(CASE WHEN cash.amount < 0 THEN cash.amount END) as cash_negative')
)->leftjoin('current_transaction as current', 'current.created_by', '=', 'user.id')
->leftjoin('cash_transaction as cash', 'cash.created_by', '=', 'user.id')
->whereBetween('current.created_at', [$start_date->format('Y-m-d'), $end_date->format('Y-m-d')])
->whereBetween('cash.created_at', [$start_date->format('Y-m-d'), $end_date->format('Y-m-d')])
->where('user.type', 3)
->groupBy('user.name')
->get();
<小时/>
更新
我正在尝试使用 M Khalid 的解决方案,以下是错误消息:
- ->mergeBindings($CUT)
Symfony\Component\Debug\Exception\FatalThrowableError: Type error: Argument 1 passed to Illuminate\Database\Query\Builder::mergeBindings() must be an instance of Illuminate\Database\Query\Builder
- ->mergeBindings($CUT->getBindings())
Symfony\Component\Debug\Exception\FatalThrowableError: Type error: Argument 1 passed to Illuminate\Database\Query\Builder::mergeBindings() must be an instance of Illuminate\Database\Query\Builder, array given
- ->addBinding($CUT)
ErrorException: Object of class Illuminate\Database\Eloquent\Builder could not be converted to string
最佳答案
由于左连接,您得到了错误的总金额,并且每个连接的表可能每个用户有不止一行,这使得总金额比原始总金额高得多,要解决此问题,您需要计算这些总金额在各个子条款中,然后将它们与 main 有点像
select users.name as name,cu.*,ca.*
from users
left join (
select created_by,
sum(CASE WHEN amount > 0 THEN amount END) as current_positive,
sum(CASE WHEN amount < 0 THEN amount END) as current_negative
from current_transaction
where created_at between :start_date and :end_date
group by created_by
) cu on users.id = cu.created_by
left join (
select created_by,
sum(CASE WHEN amount > 0 THEN amount END) as cash_positive,
sum(CASE WHEN amount < 0 THEN amount END) as cash_negative
from cash_transaction
where created_at between :start_date and :end_date
group by created_by
) ca on users.id = ca.created_by
where users.type = 3
在 Laravel 中执行上述操作非常复杂,就像每个子子句获取 sql 和查询构建器对象,然后在主查询中使用它们,如下所示
// For current_transaction
$CUT = CurrentTransaction::query()
->select('created_by',
DB::raw('sum(CASE WHEN amount > 0 THEN amount END) as current_positive'),
DB::raw('sum(CASE WHEN amount < 0 THEN amount END) as current_negative')
)
->from('current_transaction')
->whereBetween('created_at', [$start_date->format('Y-m-d'), $end_date->format('Y-m-d')])
->groupBy('created_by');
$CUTSql = $CUT->toSql();
// For cash_transaction
$CAT = CashTransaction::query()
->select('created_by',
DB::raw('sum(CASE WHEN amount > 0 THEN amount END) as cash_positive'),
DB::raw('sum(CASE WHEN amount < 0 THEN amount END) as cash_negative')
)
->from('cash_transaction')
->whereBetween('created_at', [$start_date->format('Y-m-d'), $end_date->format('Y-m-d')])
->groupBy('created_by');
$CATSql = $CAT->toSql();
// Main query
User::select('user.name as name','cu.*','ca.*')
->leftjoin(DB::raw('(' . $CUTSql. ') AS cu'),function($join) use ($CUT) {
$join->on('user.id', '=', 'cu.created_by');
/* ->addBinding($CUT->getBindings());*/
})
->leftjoin(DB::raw('(' . $CATSql. ') AS ca'),function($join) use ($CAT) {
$join->on('user.id', '=', 'ca.created_by');
/* ->addBinding($CAT->getBindings()); */
})
->where('user.type', 3)
->mergeBindings($CUT) /* or try with ->mergeBindings($CUT->getBindings()) */
->mergeBindings($CAT) /* or try with ->mergeBindings($CAT->getBindings()) */
->get();
关于mysql - 连接表的总金额不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47654789/