选择查询中的列总和

问题描述:

我在sql server select查询中遇到问题。我有下表。选择查询中的列总和

ID-----Name----Quantity 
1-------a-----------10 
2-------b-----------30 
3-------c-----------20 
4-------d-----------15 
5-------e-----------10 
6-------f-----------30 
7-------g-----------40 

我想选择那些记录所在的数量总和为<的值。例如,如果我说,选择那些记录在数量总和< 65则输出将是

ID-----Name----Quantity 
1-------a-----------10 
2-------b-----------30 
3-------c-----------20 

,因为如果我们有下一个记录,然后数量的总和将75

我要创建这个查询。请帮助我。

+2

Mysql或SQL Server?你为什么用两个标签标记它? – 2013-04-11 06:46:34

你可以简单地使用一个相关的子查询来做到这一点,它对于MySQL和SQL Server都可以正常工作。但它不是最好的性能明智的解决方案:

SELECT 
    ID, 
    Name, 
    Quantity 
FROM 
(
    SELECT 
    t1.ID, 
    t1.Name, 
    t1.Quantity, 
    (SELECT SUM(t2.Quantity) 
    FROM tablename AS t2 
    WHERE t2.ID <= t1.ID) AS Total 
    FROM Tablename AS t1 
) AS t 
WHERE Total < 65; 

看到它在行动:明智

| ID | NAME | QUANTITY | 
------------------------ 
| 1 | a |  10 | 
| 2 | b |  30 | 
| 3 | c |  20 | 

最佳性能:

这会给你解决方案是使用递归CTE。

WITH CTE_Prepare AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (ORDER BY id) AS RN 
    FROM TableRT 
) 
, CTE_Recursive AS 
(
    SELECT ID, Name, Quantity, QUantity AS SumQuantity, RN FROM CTE_Prepare WHERE RN = 1 
    UNION ALL 
    SELECT p.ID, p.Name, p.Quantity, r.SumQuantity + p.Quantity AS SumQuantity, r.RN + 1 AS RN FROM CTE_Recursive r 
    INNER JOIN CTE_Prepare p ON p.RN = r.RN+1 
    WHERE r.SumQuantity + p.Quantity < 65 
) 
SELECT * 
FROM CTE_Recursive 
OPTION (MAXRECURSION 0) 

第一CTE只是计算ROW_NUMBERS,而不是用你的ID,因为重要的是不要有差距,我们通常不能肯定任何ID,这将是这种情况。

第二个CTE是两部分递归的,为每个下一行添加数量。如果需要,您可以更多地了解SQL Server递归CTE。

我认为这比找到运行总数(这就是这个概念被称为的)的任何其他方法更好,因为它只在当时处理两行 - 没有为每个计算添加所有先前的行,并且它实际上尽快停止它达到了通缉标志。

SQLFiddle - few rows sample

SQLFiddle - 10000 rows

编辑:修正了一些错误。为了快速起见,WHERE子句需要在CTE内部而不是外部。