查询多个聚合列的总和(不带groupBy)

Querying sum of multiple aggregate columns (without groupBy)

我有一个 transactions table,我正在尝试获取每种类型的总数。

简单来说就是这样

id type credit_movement
1 top_up 10000
2 fee -50
3 deduct -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 In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'project.transactions.type'; this is incompatible with sql_mode=only_full_group_by..

当我更改 database.mysql.strict = false 时,它起作用了;但是我想让它正常工作而不需要更改 mysql 配置。

据我了解,此错误表明我只选择了聚合列,但就我而言,我实际上不想 groupBy() 任何内容,因为这只是报告。

如果我尝试 groupBy('type') 它 returns 所有内容都按类型分组,但查询仅 运行 在该组中。

{
 0: {
    top_up: 10000,
    deduct: 0,
    fee: 0,
    net_expense: 10000
 }
 1: {
    top_up: 0,
    deduct: -1000,
    fee: 0,
    net_expense: -1000
 },
 // etc...
}

有没有不把strict改成false的情况下获取的方法?

{
 0 => {
    top_up: 10000,
    deduct: -1000,
    fee: -50,
    net_expense: 9850
 }
}

您的方法的问题在于最后一列,它是其他 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); 

如果我理解正确,这可能很容易,但我可能没有理解正确。

$result = DB::table('transactions')->selectRaw('type, SUM(credit_movement) as sum')->groupBy('status')->get();

这应该 return 像这样:

type sum
fee -5656
topup 8758
deduct -7625

对于总金额,您可以在 php 中完成,这样会更容易

$net = $result->sum('sum'); // equals -5656+8758-7625

希望这对您有所帮助,如果我的理解有误,请告诉我。