2012-01-24 12 views
2

私は2つのテーブルを持っています(TradingWindowsとVolumeDataと呼ぶ)。 TradingWindowsの各行には、異なる在庫ごとにstartBinとendBinがあります。 VolumeDataには、列の在庫、binIndex、ボリュームがあります。SQL For Each Loop Alternative

次の操作を行うことで、この情報を組み合わせたいと思います:TradingWindowsテーブルの各行binByIndexのすべてのボリュームを合計したいと思います。> startBinと< endBinです。 (アイデアは開始から終了までの総音量を得ることです)。

手続き型プログラミングのバックグラウンドから、これは簡単です(for-eachループを書くだけです)。私はこれがSQLで可能であることを知っていますが、私は新しく、それを行うより効率的な方法があるのだろうかと思っていました。

ありがとうございます!

+3

あなたはどのようなデータベースを使用していますか? –

+0

テーブル構造とデータの集計方法についての詳細が必要です。ループを使用してデータをどのように処理するのかを理解するのに役立ちます。 – Matthew

+1

あなたはデータベースを照会することを学んでいる間にループとカーソルが存在することを忘れてしまいます。これらはデータ処理のための非常に不便なテクニックであり、それらを使用する際のトレードオフを理解している専門家レベルの下の誰にも使用すべきではありません。 SQL Serverでは、すべてのSQLクエリタスクの95%以上が、より効率的かつ少ないコードでセットベースの方法で実行できると推定しています。 – 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 

これは、(株によって)あなたのTradingWindow行にあなたのVolumeData行を一致します、あなたの範囲にないVolumeData行をフィルタリングし、それらをストックごとにグループ化します。

EDIT:(JNKが指摘するようにstartBinとendBinが含まれますBETWEEN、)ここで非包括的バージョンです:

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は、大きなデータセットの操作用に設計されています。あなたは "たくさんの行"であると思います。私は何十億行ものテーブルを持っています。また、適切なインデックスがある場合は、かなり効率的でなければなりません。 – JNK