我有一張transactions桌子,我正在嘗試計算每種型別的總數。
簡單地說它看起來像這樣
| ID | 型別 | 信用_運動 |
|---|---|---|
| 1 | 充值 | 10000 |
| 2 | 費用 | -50 |
| 3 | 扣除 | -1000 |
我試圖將每種型別的總和顯示為報告。
top_up: 10000
fee: 50
deduct: 1000
net_expense: 9850 [top_up - deduct - fee]
$types = [
'top_up' => ['top_up'],
'deduct' => ['deduct'],
'fee' => ['fee'],
'net_expense' => ['top_up', 'deduct', 'fee'],
];
$query = DB::table('transactions');
foreach ($types as $type => $fields) {
$query->selectSub(function ($query) use ($fields) {
return $query->selectRaw('SUM(credit_movement)')->whereIn('type', $fields);
}, $type);
};
$results = $query->get();
當我這樣做時,我得到:
1140 在沒有 GROUP BY 的聚合查詢中,SELECT 串列的運算式 #1 包含非聚合列“project.transactions.type”;這與 sql_mode=only_full_group_by 不兼容..
當我改變我的時database.mysql.strict = false,它起作用了;但是我想讓它正常作業而無需更改 mysql 配置。
據我了解,此錯誤表明我只選擇聚合列,但就我而言,我實際上并不想要groupBy()任何內容,因為這只是報告。
如果我嘗試groupBy('type')它回傳按型別分組的所有內容,但查詢僅在該組內運行。
{
0: {
top_up: 10000,
deduct: 0,
fee: 0,
net_expense: 10000
}
1: {
top_up: 0,
deduct: -1000,
fee: 0,
net_expense: -1000
},
// etc...
}
有沒有辦法在不改成strictfalse的情況下獲取?
{
0 => {
top_up: 10000,
deduct: -1000,
fee: -50,
net_expense: 9850
}
}
uj5u.com熱心網友回復:
如果我理解正確,這可能很容易,但同樣我可能沒有正確理解。
$result = DB::table('transactions')->selectRaw('type, SUM(credit_movement) as sum')->groupBy('status')->get();
這應該回傳如下內容:
| 型別 | 和 |
|---|---|
| 費用 | -5656 |
| 充值 | 8758 |
| 扣除 | -7625 |
對于總和,您可以在 php 中完成,這樣會更容易
$net = $result->sum('sum'); // equals -5656 8758-7625
希望這會有所幫助,如果我錯了,請告訴我。
uj5u.com熱心網友回復:
您的方法的問題在于最后一列是其他 3 列的總和,因此您不能使用 SUM,因為您沒有要分組的列。您可以使用子查詢,但我認為最好的解決方案是對從更簡單的查詢中獲得的原始資料進行一些詳細說明。
$query = DB::table('transactions')
->selectRaw('type, SUM(credit_movement) AS movements')
->groupBy('type');
$results = array_reduce($query->get(), function(array $res, array $value){
$res[$array['type']] = $array['movements'];
return $res;
}, []);
$results['net_expense'] = array_sum($results);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/363693.html
標籤:php mysql 拉拉维尔 通过...分组 laravel 查询构建器
上一篇:HTML中的嵌套PHP塊
