我正在尝试基于列的总和检索数据的子集。我们的目标是一个脚本来释放积压的项目。假设我们有100个BO产品,有50个库存。我想要更新订单数量总和小于50的最旧订单。所以就像这样:
示例架构:
Orders Table:
order_id, order_date
order_products Table:
order_product_id, order_id, product_id, product_status, ordered_quantity
select * from products
where products_id=1234
and status=1
and sum(products_qty) < 50;
其中,sum(products_qty)是返回的总数量,而不仅仅是单个行的返回数量。不确定是否可以使用单个查询或子查询,但我认为我应该先请教这里的专家。我尽量避免返回所有行,然后手动计数,直到达到限制。
发布于 2010-09-03 17:03:27
在使用SUM()
和COUNT()
等聚合函数时,不能在WHERE
子句中使用它们。当数据库扫描表/索引时,WHERE子句是逐行应用的,这意味着聚合函数的结果还不可用。
通过聚合结果进行过滤必须使用HAVING
完成,这基本上是在将数据返回给客户端之前的最后一步。
根据您的需求,您需要保留一个运行计数,直到您检索到足够的行/订单来用完正在输入的新产品。这不是一个查询就能完成的。您需要使用服务器端变量来跟踪单个缺货订单“使用”了多少产品。
在我的脑海中,像这样的东西可能会起到作用:
SET @Available = 50;
SELECT order_id, SUM(ordered_quantity), @Available := @Available - SUM(ordered_quantity) AS available
FROM order_products
WHERE product_id = XXX
GROUP BY order_id, product_id
HAVING available >= 0;
使用任何额外的WHERE子句,这样您就可以先得到最早的缺货订单
发布于 2010-09-03 15:57:58
您需要使用GROUP by和Having
select * from products
where products_id=1234
and status=1
group by YourGroupingFields
Having sum(products_qty) < 50;
根据您的信息:
select product_id from products
where status=1
group by product_id
Having sum(products_qty) < 50;
将返回总数量小于50的product_id
https://stackoverflow.com/questions/3637463
复制相似问题