【问题标题】:return rows where sum on a field less than a given value返回字段总和小于给定值的行
【发布时间】:2011-09-07 20:16:27
【问题描述】:

我对 MySQL 的了解是基本的。我想构建一个查询以按升序返回对给定值求和的所有行。我不知道我该怎么做。使用 sum() 只返回一行。我尝试了一个子查询,但它返回所有行。我不想让任何人做我的工作,我只想让你帮我解决这个问题。 有人有想法吗?

如何检索其提交的“值”总和为 30 的所有行 示例:

given value: 30
field to sum: value


table:
id name      value  order
1  name1     3      1
2  name2     10     6
3  name3     13     3
4  name4     5      8
5  name5     20     25

因此,查询必须返回: 编号 1、编号 3、编号 2、编号 4

提前致谢。

【问题讨论】:

  • 列出的行数之和不等于 30(结果为 31)。正确的行(可能是) - 2、5。如果获得结果的方法不止一种会怎样?
  • 是的,结果是 31,因为我需要开始按以下顺序求和:1、3、6、8。顺序为 8 的行中的值如何更接近 30,查询必须检索该值行。
  • 请澄清问题!编辑:哎呀,我猜我有一段时间没有刷新页面了。对不起!

标签: mysql sql


【解决方案1】:
set @total:=0;
select id, name, value, `order`
from 
(select 
 id, name, value, `order`, 
 @total:=if(@total is null, 0, @total)+`order` as total
 from THE_TABLE
 order by `order`
) as derived 
where total<=30;

【讨论】:

    【解决方案2】:

    使用 postgres 作为数据库,我认为这可以满足您的需求。我不确定它在 mysql 中是否类似:

    CREATE TABLE test (
    id int,
    name varchar(50),
    value int,
    order_ int
    );
    
    INSERT INTO test values (1,  'name1',     3,  1);
    INSERT INTO test values (3,  'name3',     13, 3);
    INSERT INTO test values (2,  'name2',     10, 6);
    INSERT INTO test values (4,  'name4',     5,  8);
    INSERT INTO test values (5,  'name5',     20, 25);
    
    SELECT * FROM (SELECT  *, SUM(value) OVER (ORDER BY order_) sumvalues FROM TEST) a WHERE sumvalues <30 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 2014-08-07
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多