2012-01-24 69 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