2013-04-11 59 views
3

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

回答

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 | 
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內部而不是外部。