SUM 一列然后减去另一列的 SUM 并得到值 0 而不是负值

SUM a column then SUBTRACT the SUM of another column and get values 0 instead of negative values

如何获得 $sum 0 值而不是负值?我看到人们使用 < then .. else 0 但是当我尝试时,它显示错误的值:(

stock_movement_details.db:-

stock_movement.db

raw_material.db

如您所见,我输入的是 (subtract/add)。比方说,ID 10 for raw_material_id,数量是 10.00,ID 11&12 减去 9.48,逻辑是 (10- 9.48 -9.48 = -8.96)。但是,我希望它不是负值,而是 0。

Table显示数量余额:-

$rawMaterials = RawMaterials::where(['status' => 'Active'])->get();

$rawMaterials = $rawMaterials->map(function ($f) {

$total = DB::select('select 
         ( sum(case when detail.type="add" then detail.quantity else 0 end) - sum(case when detail.type="subtract" then detail.quantity else 0 end) ) as total
         from stock_movement_details detail
         left join stock_movements main on main.id = detail.stock_movement_id
         where detail.raw_material_id = ?
         ', [$f->id]);

            $sum = 0;
            foreach ($total as $t) {
                $sum += $t->total;
            }

            $rawMats = [
                "id" => $f->id,
                "total" => $sum,
            ];
            return $rawMats;
        });

您可以在查询中添加另一个 CASE 表达式,以检查 total 是否为负数,但这意味着您应该重复计算两个总和之差的表达式。

最好将您的查询用作子查询并在外部查询中检查 total:

SELECT CASE WHEN total < 0 THEN 0 ELSE total END AS total
FROM (
  SELECT SUM(CASE WHEN d.type = "add" THEN d.quantity ELSE 0 END) - 
         SUM(CASE WHEN d.type = "subtract" THEN d.quantity ELSE 0 END) AS total
  FROM stock_movement_details d LEFT JOIN stock_movements m 
  ON m.id = d.stock_movement_id
  WHERE d.raw_material_id = ?
) t

此外,我认为不需要将 stock_movement_details 连接到 stock_movements,因为您没有在查询中使用 stock_movements 的任何列.

您可以简化为:

SELECT CASE WHEN total < 0 THEN 0 ELSE total END AS total
FROM (
  SELECT SUM(CASE WHEN type = "add" THEN quantity ELSE 0 END) - 
         SUM(CASE WHEN type = "subtract" THEN quantity ELSE 0 END) AS total
  FROM stock_movement_details
  WHERE raw_material_id = ?
) t

或:

SELECT CASE WHEN total < 0 THEN 0 ELSE total END AS total
FROM (
  SELECT SUM(CASE type WHEN "add" THEN 1 WHEN "subtract" THEN -1 ELSE 0 END * quantity) AS total
  FROM stock_movement_details
  WHERE raw_material_id = ?
) t