0

次の要件を持つ sql スクリプトを作成しています。この累計列は、Transaction_datetime が表示されている Asset_id の Transaction_datetime 以下であるすべての Asset_Transactions の Units を合計することによって計算されます。私はそれを達成しました、そしてそれはうまくいっていると思います。

ただし、私の 2 番目の要件は次のとおりです。

2) その日付の単位の値を計算します。これは、各 asset_transaction の日付とその特定の資産の Unit_Price テーブルから Sell_unitPrice を取得し、追加された単位数 (「現在の合計」) で乗算します。ステップ2で苦労しています

Sybase データベースのスキーマ リンクをクリックします--

これまでに書いたコード。

set nocount on
   go

     declare mla_exceptions scroll cursor for
                 select distinct mla.asset_id  from    asset_transaction mla
go

Print 'asset_id, Amount, Transaction Name, Total Units, Transaction Datetime'

declare @ml_asset double precision

open mla_exceptions

fetch first mla_exceptions

              into @ml_asset  

              while (@@sqlstatus = 0)

              begin  
              select    mla.asset_id , ',',
               -- mla.transaction_datetime, ',',
              mla.amount, ',',
              tt.name, ',',
             (select sum (units) from asset_transaction where transaction_datetime <= mla.transaction_datetime  and asset_id = @ml_asset  and status = 'A' ) 'Running Total Units', ',',
              transaction_datetime 
          from    asset_transaction mla noholdlock 
          Left outer join transaction_type tt on tt.transaction_type_id = mla.transaction_type_id  where   mla.asset_id = @ml_asset 
order by mla.asset_id

fetch next mla_exceptions
 into @ml_asset 
end

close mla_exceptions

deallocate cursor mla_exceptions

go
4

1 に答える 1

1

おめでとう。要件 1 を解決するためのあなたの粘り強さに感心します。残念ながら、同じテーブル内で 2 回読み取り、noholdlock でロックを制御しようとしているため、パフォーマンスは低下します。

同じアセット ID が複数存在する場合はどうなりますか? 同じ資産の合計を複数回計算します。

これは、より優れた SQL ソリューションです。名前が #asset_sum で、列が asset_id と asset_sum の一時テーブルを作成します。次に、この一時テーブルを元のテーブルに結合します。

その結果、カーソルがなくなり、ロックが少なくなり、冗長性がなくなります。

後で確認して、詳細な回答を差し上げます。

于 2012-09-14T07:16:59.187 に答える