执行多个数据透视表连接查询使用Laravel Join执行SUM

ve7v8dk2  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(109)

有三张table要拼我,
1.产品:ID

  1. product_purchase:product_id,purchase_id,数量,小计
  2. product_warehouse:product_id,purchase_id,quantity
    这里的产品有多个数据透视表,如product_purchase、product_warehouse。我想对每个产品id执行一个sum查询。我写的查询是,
Product::select('products.id', 'products.code')
        ->selectRaw('sum(product_warehouse.quantity) as remaining_quantity')
            ->leftjoin('product_warehouse', 'product_warehouse.product_id', '=', 'products.id')
            ->leftjoin('product_purchase', 'product_purchase.product_id', '=', 'products.id')
            ->groupBy( 'products.id' )
            ->fromCompany()
            ->get();

结果就是

[
{
id: 7,
code: "part1",
remaining_quantity: "8.000000000000000000"
},
{
id: 8,
code: "part2",
remaining_quantity: "6.000000000000000000"
},
{
id: 9,
code: "part-full",
remaining_quantity: "0.000000000000000000"
}
]

剩余数量总和执行错误。我正在寻求帮助,我写的查询哪里出错了。期待您的回答和评论。

2izufjch

2izufjch1#

您应该计算的数量总和从仓库的每一个产品之前,它是受影响的加入与采购。然后,还要计算每个产品的购买数量之和,以便不受仓库联接的影响。最后,将这两个表左连接到products表,以获得组合视图。

$productWarehouseSubquery = DB::table('product_warehouse')
    ->select('product_id', DB::raw('SUM(quantity) as warehouse_quantity'))
    ->groupBy('product_id');

$productPurchaseSubquery = DB::table('product_purchase')
    ->select('product_id', DB::raw('SUM(quantity) as purchase_quantity'))
    ->groupBy('product_id');

$products = Product::select('products.id', 'products.code')
    ->selectRaw('COALESCE(warehouse_quantity, 0) - COALESCE(purchase_quantity, 0) as remaining_quantity')
    ->leftJoinSub($productWarehouseSubquery, 'product_warehouse', function ($join) {
        $join->on('product_warehouse.product_id', '=', 'products.id');
    })
    ->leftJoinSub($productPurchaseSubquery, 'product_purchase', function ($join) {
        $join->on('product_purchase.product_id', '=', 'products.id');
    })
    ->fromCompany()
    ->get();

这将为您提供product_warehouse和product_purchase表中每个product_id的数量之和,而不会在通过单个查询连接所有表时受到行乘法的干扰。因此,remaining_quantity的计算方法是从合计warehouse_quantity中减去合计purchase_quantity。
注意,COALESCE用于处理product_warehouse或product_purchase表中没有给定product_id的记录的情况。

相关问题