3

我在 sql server 选择查询中有问题。我有下表。

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

因为如果我们包含下一条记录,那么 Quantity 的总和将为 75。

我想创建这个查询。请帮帮我。

4

2 回答 2

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 |
于 2013-04-11T06:51:41.857 回答
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 是两部分递归的,为下一行添加 Quantity。如果需要,您可以通过 Google 搜索更多关于 SQL Server 递归 CTE 的信息。

我认为这比任何其他查找运行总计的方法更好(这就是这个概念的名称),因为它当时只适用于两行 - 不会为每个计算添加所有先前的行,它实际上会在达到所需的值时立即停止标记。

SQLFiddle - 几行示例

SQLFiddle - 10000 行

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

于 2013-04-11T07:03:35.660 回答