我有一个名为stock_movements的表:
| 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的总和。
即 按产品分组,类型 每种类型的总数量
关键是它是针对产品的收藏品,这是我努力奋斗的目标。有人有什么建议吗?
到目前为止,我已经...
return $this->stockMovements()->groupBy('product_id')
->selectRaw('sum(qty), product_id')
->where('type', $this->type)
->get();
但是对于类型A和类型B,这并不分开。
答案 0 :(得分:2)
您需要一个基本的数据透视查询,在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查询。
答案 1 :(得分:0)
使用原始表达式
$result = DB::table('stock_movements')
->select(DB::raw('sum(qty) as sum_qty, type'))
->groupBy('type')
->get();
在SELECT子句中使用聚合函数的经验法则。
如果选择块确实具有GROUP BY子句,则任何列 SELECT子句中指定的规范必须专门作为 聚合函数的参数或给定列的列表中 在GROUP BY子句中,或同时在两者中。
有关更多详细信息: http://www.informit.com/articles/article.aspx?p=664143&seqNum=6