我在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。
我想创建此查询。请帮帮我。
答案 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。
我认为这比找到运行总计的任何其他方法更好(这就是这个概念的名称),因为它当时只能处理两行 - 不为每个计算添加所有先前的行,它实际上会立即停止达到想要的标记。
编辑:纠正了一些错误。为了使其快速,WHERE子句需要在CTE内部而不是在外部。