2014-06-10 21 views
0

我希望這是有道理的,因爲我想要做的是SUM行基於現有行的其他列。我嘗試了幾種不同的方式,我希望現在接近的是我在這裏。這不是我的完整的SQL,但希望這個小例子讓我在賽道SQL Server總結一個地方或有條件

SELECT Price,SUM(Item) from table where Price >= Price group by Price 

Sample Data 
| PRICE | ITEM | 
|-------|-------| 
| 1.00 |  5 | 
| 2.00 |  9 | 
| 3.00 |  2 | 

Hopeful Result 
| PRICE | ITEM | 
|-------|-------| 
| 1.00 |  5 | 
| 2.00 | 14 | 
| 3.00 | 16 | 

實際的結果是或多或少這是我對價格的分組是很有意義的,它返回我期望樣本數據像這樣的行。我似乎無法想象在我的選擇中包括價格而無需對其進行分組或使用聚合。我想我也許可以用內部選擇做這種計算,但我希望有一種不同的方式,因爲我的實際查詢有很多連接,如果我走這條路線會變得混亂。

感謝您的任何幫助。

回答

2

如果你使用SQL Server 2012的...

Select price, item, sum(item) OVER(order by price rows unbounded preceding) as runningtotal 
from sample 

http://sqlfiddle.com/#!6/36e9f/1/0

+0

我很高興我有2012版。這很光滑。 – Kohins

+0

[OVER analytic functions](http://msdn.microsoft.com/zh-cn/library/ms189461.aspx)在需要獲取獨立於主查詢(窗口化結果)的結果時提供了巨大的價值;運行總數,對數據子集的計算等。非常強大,值得學習如何以及何時使用。 – xQbert

0

也許你正在嘗試做下面的事情。與同一張表使用self join

看到一個DEMO Here

SELECT t1.Price, SUM(t2.Item) 
FROM table1 t1, 
     table1 t2 
WHERE t2.Price <= t1.Price 
GROUP BY t1.Price 
ORDER BY t1.price; 
1

你可以用一個子查詢做到這一點,但更有效的方法可能是使用一個CROSS/OUTER APPLY。這取決於你的具體數據。我提供了以下兩種方法......根據您的具體數據查看哪個方法運行得更快。

子查詢方法

SELECT DISTINCT op.Price, (SELECT SUM(ip.Item) FROM table ip WHERE ip.Price <= op.Price) as ITEM FROM table op ORDER BY op.Price ASC 

外應用方法

SELECT DISTINCT op.Price, a.Items 
FROM table op 
OUTER APPLY (SELECT SUM(ip.Item) as Items FROM TABLE ip WHERE ip.Price <= op.Price) a 
ORDER BY op.Price ASC 
+0

因此,如果我的實際選擇類似於「SELECT DISTINCT op.Price,a.Items FROM表op op左連接table2 t2 op.Id = t2.Id」我是否必須將這一切都包含在第二個選擇裏面的外面適用? – Kohins

+0

是的,如果需要獲取數字,它將不得不包含在APPLY查詢中。基本上,APPLY是一種執行子查詢的更高性能的方式,因爲它允許SQL Server在查詢期間將其緩存到一個函數中 - 讓它運行速度更快。 – Ruslan

+0

如果您確實擁有大量數據(數十萬行),則可能需要將WITH(NOLOCK)添加到所有查詢中(儘管NOLOCK有影響)。或者,您可能希望將數據放入表變量或臨時表中以使其運行速度更快。如果你想採取這樣的路線,讓我知道,我會更新我的答案與例子如何獲得更快的表現。 – Ruslan