选择查询中的列总和
问题描述:
我在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
我要创建这个查询。请帮助我。
答
你可以简单地使用一个相关的子查询来做到这一点,它对于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。
我认为这比找到运行总数(这就是这个概念被称为的)的任何其他方法更好,因为它只在当时处理两行 - 没有为每个计算添加所有先前的行,并且它实际上尽快停止它达到了通缉标志。
编辑:修正了一些错误。为了快速起见,WHERE子句需要在CTE内部而不是外部。
Mysql或SQL Server?你为什么用两个标签标记它? – 2013-04-11 06:46:34