web-dev-qa-db-ja.com

テーブルの各行をSQL​​ループ

株式の売買シグナルを生成するプログラムを作成しました。また、さまざまなシグナルをテストし、各取引のリターンを提供するロジックも作成しました。

次のステップは、長期間にわたって戦略とそのルールをシミュレートすることです。すべての情報はテキストファイルにエクスポートされ、SQL Serverデータベースのテーブルにインポートされます。 StartCapitalCurrentCapitalNumberOfPositionsPositionsLeftなどの変数を宣言する必要があることに気づきました。列の1つはBuyPriceという名前で、購入する時期と価格を示します。これが発生した場合、NumberOfPositionsは1だけ減算されます。

SellPriceは、いつ、どの価格に売るかを示します。これが発生した場合、NumberOfPositionsを1つ追加する必要があります。 NumberOfPositionsの最大値は5で、最小値は0です。望ましい結果は、CurrentCapitalがどのように展開されるかを確認することです。

フォームを開始するための入力とSQLコードの種類に感謝します。

6
vighurt

ループする別の方法があります。多くの回答でカウンターが1ずつ増加するのを見てきましたが、私の経験では、データセット内のIDにギャップがないとは限りません。

ここに私がよく使う解決策があります:

declare @idColumn int

select @idColumn = min( TableID ) from Table

while @idColumn is not null
begin
    /*
        Do all the stuff that you need to do
    */
    select @idColumn = min( TableID ) from Table where TableID > @idColumn
end
26
Owen

質問のキャプションに基づいています。これは、TABLE型の変数を使用してテーブルの各行をループする方法です。

DECLARE
    @counter    INT = 1,
    @max        INT = 0

-- Declare a variable of type TABLE. It will be used as a temporary table.
DECLARE @myTable TABLE (
    [Id]        int identity,
    [Column1]   nvarchar(max),
    [Column2]   nvarchar(100)
)

-- Insert your required data in the variable of type TABLE
INSERT INTO @myTable
SELECT Column1, Column2
FROM [dbo].[YOUR_DATABASE_TABLE]

-- Initialize the @max variable. We'll use thie variable in the next WHILE loop.
SELECT @max = COUNT(ID) FROM @myTable

-- Loop 
WHILE @counter <= @max
BEGIN

    -- Do whatever you want with each row in your table variable filtering by the Id column
    SELECT Column1, Column2
    FROM @myTable
    WHERE Id = @counter

    SET @counter = @counter + 1
END
10