选择查询中的列总和

时间:2013-04-11 06:44:20

标签: sql sql-server sql-server-2008

我在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

我想选择那些数量总和<&lt;值。例如,如果我说选择那些数量总和<65的记录,那么输出将是

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

因为如果我们包含下一条记录,则数量之和将为75。

我想创建此查询。请帮帮我。

2 个答案:

答案 0 :(得分:5)

您可以简单地使用相关子查询来执行此操作,它对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 |

答案 1 :(得分:2)

最佳性能解决方案是使用递归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内部而不是在外部。