2012-05-24 10 views
0

다음 요구 사항이있는 SQL 스크립트를 작성 중입니다. - 1) Asset_Transaction 테이블에서 모든 레코드를 가져올 수 있어야하며 모든 자산에 대해 각 레코드에 대해 누적 합계를 계산하여 단위 수를 계산할 수 있어야합니다. 이 누적 합계 열은 Transaction_datetime이 표시된 Asset_id의 Transaction_datetime보다 작거나 같은 모든 Asset_Transactions에 대해 Units를 합산하여 계산됩니다. 나는 그것을 성취했으며, 나는 그것이 잘되고 있다고 생각한다.누적 합계 Sybase

그러나 내 두 번째 요구 사항은 다음과 같습니다 -

2) 각 asset_transaction의 날짜 및 특정 자산에 대한 UNIT_PRICE 테이블에서 sell_unitPrice을 얻을 수의 곱입니다 날짜 단위의 값을 계산 추가 된 단위 ("누적 합계")의 합계입니다. 나는

내가 지금까지 쓴

SCHEMA FOR Sybase DATABASE Click ON LINK--

코드 2 단계에 고투하고있다.

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 

답변

1

축하합니다. 나는 요구 사항 1을 해결하기 위해 당신의 끈기에 감탄했습니다. 불행히도 성능은 열악합니다. 왜냐하면 당신은 그 자체로 두 번 같은 테이블을 읽고 noholdlock으로 자물쇠를 제어하려고하기 때문입니다.

동일한 저작물 ID가 여러 번 존재하면 어떻게 될까요? 동일한 자산의 합계를 여러 번 계산하게됩니다.

다음은 더 나은 SQL 솔루션입니다. #asset_sum 및 columns asset_id 및 asset_sum이라는 이름으로 임시 테이블을 만듭니다. 그런 다음이 임시 테이블을 원본 테이블과 조인하십시오.

결과로 커서가 없으며 잠금이 적고 중복성이 없습니다.

자세한 내용은 나중에 다시 확인하겠습니다.