2012-01-24 127 views
2

我有兩個表(我們稱它們爲TradingWindows和VolumeData)。 TradingWindows的每一行都有針對每種不同庫存的startBin和endBin。在VolumeData中,有列庫存,binIndex,卷。SQL For-each Loop Alternative

我想通過以下操作來合併這些信息:for-TradingWindows表中的每一行我想總結> startBin和< endBin的所有卷binIndex。 (這個想法是在開始和結束之間獲得總音量)。

現在,來自程序編程背景,這很容易(只需寫一個for-each循環)。我知道這在SQL中是可行的,但我是新的,並想知道是否有更有效的方法來做到這一點。

謝謝!

+3

您正在使用什麼數據庫? –

+0

我們需要關於您的表格結構的更多信息以及您想如何彙總數據......這將有助於瞭解如何通過循環來實現。 – Matthew

+1

在學習查詢數據庫時,你想忘記存在循環和遊標。對於數據處理來說,這是非常不利的技術,不應該由專家級別以下的人理解使用它們的權衡。對於SQL Server,我估計95%或更多的所有sql查詢任務可以更有效地以更少的代碼以基於集合的方式完成。 – HLGEM

回答

5

我做你的表結構的一些猜測,但我認爲你正在尋找的東西是這樣的:

Select VD.stock, Sum(volume) 
From VolumeData VD 
    Inner Join TradingWindows TW On VD.stock = TW.stock 
Where VD.binIndex Between TW.startBin And TW.endBin 
Group By VD.stock 

這將您VolumeData行跟得上你TradingWindow行(通過股票)過濾不在您範圍內的VolumeData行,並將它們按庫存分組。

編輯:這是一個非包容性的版本(如JNK指出,BETWEEN將包括startBin和endBin):

Select VD.stock, Sum(volume) 
    From VolumeData VD 
     Inner Join TradingWindows TW On VD.stock = TW.stock 
    Where VD.binIndex > TW.startBin And VD.binIndex < TW.endBin 
    Group By VD.stock 
+0

唯一的問題是這些表是超大的(兩個表中都有大量的行)。這不會爆炸嗎? – user1167650

+0

+1,但有一個小小的詭辯 - 看起來OP想要**不包括基於描述的'startbin'和'endbin',所以你可能不想使用'BETWEEN',因爲它是包含性的。 – JNK

+1

@ user1167650 - SQL針對大量數據集進行操作。你認爲「很多很多行」可能不是那麼多。我擁有數十億行「JOIN」的表格。另外,如果你有合適的索引,它應該非常高效。 – JNK