首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >根据列的总和返回行

根据列的总和返回行
EN

Stack Overflow用户
提问于 2010-09-03 23:55:00
回答 2查看 274关注 0票数 2

我正在尝试基于列的总和检索数据的子集。我们的目标是一个脚本来释放积压的项目。假设我们有100个BO产品,有50个库存。我想要更新订单数量总和小于50的最旧订单。所以就像这样:

示例架构:

代码语言:javascript
代码运行次数:0
运行
复制
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)是返回的总数量,而不仅仅是单个行的返回数量。不确定是否可以使用单个查询或子查询,但我认为我应该先请教这里的专家。我尽量避免返回所有行,然后手动计数,直到达到限制。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-04 01:03:27

在使用SUM()COUNT()等聚合函数时,不能在WHERE子句中使用它们。当数据库扫描表/索引时,WHERE子句是逐行应用的,这意味着聚合函数的结果还不可用。

通过聚合结果进行过滤必须使用HAVING完成,这基本上是在将数据返回给客户端之前的最后一步。

根据您的需求,您需要保留一个运行计数,直到您检索到足够的行/订单来用完正在输入的新产品。这不是一个查询就能完成的。您需要使用服务器端变量来跟踪单个缺货订单“使用”了多少产品。

在我的脑海中,像这样的东西可能会起到作用:

代码语言:javascript
代码运行次数:0
运行
复制
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子句,这样您就可以先得到最早的缺货订单

票数 0
EN

Stack Overflow用户

发布于 2010-09-03 23:57:58

您需要使用GROUP by和Having

代码语言:javascript
代码运行次数:0
运行
复制
select * from products 
where products_id=1234 
and status=1 
group by YourGroupingFields
Having sum(products_qty) < 50;   

根据您的信息:

代码语言:javascript
代码运行次数:0
运行
复制
select product_id from products 
where status=1 
group by product_id
Having sum(products_qty) < 50;   

将返回总数量小于50的product_id

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3637463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档