Php Laravel查询生成器-求和位置和求和位置
我有一张名为stock_movements的桌子:Php Laravel查询生成器-求和位置和求和位置,php,laravel,eloquent,query-builder,laravel-query-builder,Php,Laravel,Eloquent,Query Builder,Laravel Query Builder,我有一张名为stock_movements的桌子: | product_id | type | qty | |------------|------|------| | 1 | A | 2 | | 1 | A | 1 | | 1 | A | 7 | | 1 | B | -2 | | 1 | B | -4 | | 1 | B |
| product_id | type | qty |
|------------|------|------|
| 1 | A | 2 |
| 1 | A | 1 |
| 1 | A | 7 |
| 1 | B | -2 |
| 1 | B | -4 |
| 1 | B | -1 |
| 2 | A | 2 |
| 2 | A | 1 |
| 2 | A | 7 |
| 2 | B | -3 |
| 2 | B | -3 |
| 2 | B | -1 |
我试图创建一个产品集合,其中的值为a和B之和
i、 e。
按产品、类型分组
每种类型的总数量
关键是,这是一个针对产品的集合,这是我正在努力解决的问题。有人有什么建议吗
到目前为止我已经
return $this->stockMovements()->groupBy('product_id')
->selectRaw('sum(qty), product_id')
->where('type', $this->type)
->get();
但是对于类型A和类型B,这并没有分开。您需要一个基本的pivot查询,它在Laravel中看起来像这样:
return $this->stockMovements()
->selectRaw("SUM(CASE WHEN type = 'A' THEN qty ELSE 0 END) AS sum_a, ".
"SUM(CASE WHEN type = 'B' THEN qty ELSE 0 END) AS sum_b, product_id")
->groupBy('product_id')
->get();
我删除了
WHERE
子句,因为您的数据似乎只有两种类型,限制这一点没有多大意义。如果您真的只需要A或B的数量总和,那么我们可以编写一个更简单的Laravel/MySQL查询。您需要一个基本的pivot查询,它在Laravel中看起来像这样:
return $this->stockMovements()
->selectRaw("SUM(CASE WHEN type = 'A' THEN qty ELSE 0 END) AS sum_a, ".
"SUM(CASE WHEN type = 'B' THEN qty ELSE 0 END) AS sum_b, product_id")
->groupBy('product_id')
->get();
我删除了WHERE
子句,因为您的数据似乎只有两种类型,限制这一点没有多大意义。如果您真的只需要A或B的数量之和,那么我们可以编写一个更简单的Laravel/MySQL查询。使用原始表达式
$result = DB::table('stock_movements')
->select(DB::raw('sum(qty) as sum_qty, type'))
->groupBy('type')
->get();
在SELECT子句中使用聚合函数的经验法则
如果select块没有GROUP BY子句,则任何列
SELECT子句中指定的规范必须作为
聚合函数或给定列列表中的参数
在GROUP BY子句中,或在两者中
有关详细信息:
使用原始表达式
$result = DB::table('stock_movements')
->select(DB::raw('sum(qty) as sum_qty, type'))
->groupBy('type')
->get();
在SELECT子句中使用聚合函数的经验法则
如果select块没有GROUP BY子句,则任何列
SELECT子句中指定的规范必须作为
聚合函数或给定列列表中的参数
在GROUP BY子句中,或在两者中
有关详细信息:
可能按类型分组?可能按类型分组?这很有效,谢谢。但是,如果sum_a和sum_b的和都为0,它也会返回结果。有没有办法排除这些因素?@AdamLambert Yes使用
->having('sum_a','>',0)->havingRaw('sum_b','>',0)
,或者使用->havingRaw('sum(当类型为'a'时,数量为0结尾)>,[0])
这很有效,谢谢。但是,如果sum_a和sum_b的和都为0,它也会返回结果。有没有办法排除这些因素?@AdamLambert Yes使用->having('sum_a','>',0)->havingRaw('sum_b','>',0)
,或者使用->havingRaw('sum(当类型为'a'时,则数量为0结尾)>,[0])