0

我正在编写一个具有以下要求的 sql 脚本:- 1) 它应该能够从 Asset_Transaction 表中获取每条记录,并为每条资产计算每条记录上的“运行总计”的单位数。通过汇总 Transaction_datetime 小于或等于所显示 Asset_id 的 Transaction_datetime 的所有 Asset_Transactions 的 Units 来计算此运行总计列。我已经做到了,我认为它工作正常。

但是我的第二个要求是:-

2) 计算该日期的单位价值,即从 Unit_Price 表中获取每个资产交易日期和该特定资产的销售单位价格,并将其乘以添加的单位数量(“运行总计”)。我在第 2 步上苦苦挣扎

SCHEMA FOR Sybase DATABASE 点击链接——

到目前为止我写的代码。

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 的毅力。不幸的是,性能会很差,因为你在同一张表内部读取了两次,并试图用 noholdlock 控制锁。

如果相同的资产 ID 存在多次怎么办?您将多次计算同一资产的总和。

这是一个更好的 SQL 解决方案。创建一个名为 #asset_sum 的临时表,其中包含asset_id 和asset_sum 列。然后将此临时表与原始表连接起来。

结果是没有游标、更少的锁和没有冗余。

我稍后会回来给你一个详细的答案。

于 2012-09-14T07:16:59.187 回答