2012-01-24 2 views
2

У меня есть две таблицы (назовем их TradingWindows и VolumeData). Каждая строка TradingWindows имеет startBin и endBin для каждого другого запаса. В VolumeData есть столбец, binIndex, том.SQL For-each Loop Alternative

Я хочу объединить эту информацию, выполнив следующую операцию: для каждой строки в таблице TradingWindows я хочу суммировать все тома binIndex, которые являются> startBin и < endBin. (идея состоит в том, чтобы получить общий объем между началом и концом).

Теперь, исходя из процедурного фона программирования, это легко (просто напишите для каждого цикла). Я знаю, что это возможно в 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, которые не входят в ваш диапазон, и группируйте их вместе по запасам.

EDIT: Вот не включено версия (как 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