求和直到某一点 - MySql

时间:2009-05-08 13:05:12

标签: mysql sum

如何查询并显示记录,直到达到一定数量?

假设您要选择学生,直到学生的总金额达到1000?

加成

 Student ID   Student Name   Student Money 
 ---------    -----------     --------------
   1           John            190
   2           Jenny           290
   3           Ben             200
   4           Andy            120
   5           Lynna           300

如果我想在500点停下来,我会得到1号和2号记录(190 + 290)。 如果我想在1000点停下来,我会把记录1推到4点。

3 个答案:

答案 0 :(得分:4)

在搜索我自己的答案时遇到了这个问题。我以为我会在这里留下我的解决方案,因为这是完成相同任务的另一种方式,可能更有效率。诀窍是使用>=

进行自我加入
    SELECT s1.ID, s1.name, s1.money, sum(s2.money) 
    FROM student s1 
    INNER JOIN student s2 ON s1.id >= s2.id 
    GROUP BY s1.id HAVING SUM(s2.money) <= 500;

答案 1 :(得分:2)

SQL表没有“内在”顺序,因此您必须指定一些ORDER BY子句来赋予“until”短语任何含义。鉴于此,可以使用SELECT SUM(money)FROM学生ORDER BY xxx LIMIT N获得“第一”N个记录的总和。使用具有自然顺序整数的辅助表INTS,您可以找到最大值N类似于:

SELECT MAX(N) FROM INTS
WHERE (SELECT SUM(money) FROM student ORDER BY xxx LIMIT N) < 1000

最后将其作为整个SELECT中LIMIT子句的另一个嵌套SELECT插入。所有这些都闻起来像是效率相当低!通常,当嵌套的SELECT看起来太多而且太慢时,另一种方法是逐步执行此操作:首先使用“渐进总和”构建临时表,然后使用它来帮助您找到所需的限制。

答案 2 :(得分:1)

哎呀...... MySQL ......这个解决方案适用于MS SQL ......

这是使用ROW_NUMBER()函数的解决方案。

SELECT Student.*, SUM(StudentBefore.Money) AS AccumulatedMoney  
FROM (  
       SELECT *, ROW_NUMBER() OVER(ORDER BY Id) AS RowNumber  
       FROM Students  
     ) AS Student  
     INNER JOIN  
     (  
       SELECT *, ROW_NUMBER() OVER(ORDER BY Id) AS RowNumber  
       FROM Students  
     ) AS StudentBefore  
     ON StudentBefore.RowNumber <= Student.RowNumber  
GROUP BY Student.RowNumber, Student.Id, Student.Name, Student.Money  
HAVING SUM(StudentBefore.Money) < 1000  

执行计划表明对表进行排序是最昂贵的操作。如果要排序的列上有索引 - 您的示例表示您希望按主键ID排序 - 索引扫描将成为最昂贵的操作。