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
如何获得 $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