您的位置:首页 > 数据库

SQL脚本积累之三-----case....when...的使用示例

2015-07-19 16:01 381 查看
/*

保证金可用余额=现金

+∑(可充抵保证金的证券市值×折算率)

+∑[(融资买入证券市值-融资买入金额)×折算率]

+∑[(融券卖出金额-融券卖出证券市值)×折算率]

-∑融券卖出金额

-∑融资买入证券金额×融资保证金比例(最小50%)

-∑融券卖出证券市值×融券保证金比例(最小50%)

-利息及费用

-冻结中可用保证金

1现金=自有可用现金 + 自有冻结现金 + 融券卖出可用现金+ 融券卖出冻结现金

2可充抵保证金的证券市值 = ∑[(自有可用持仓中+自有交割冻结持仓)×市价×折算率]—-【剔除非担保品证券】

3融资买入证券市值 =当前本代码融资买入总持仓数量×市价

4融资买入金额 = 本代码融资负债未还金额

5融券卖出金额=MAX[融券卖出证券(尚未偿还)的数量×融券卖出时发生的价格-该融券负债发生时的交易费,0]

6融券卖出证券市值=融券卖出证券(尚未偿还)数量×市价

7融资买入证券金额 = 融资负债未还金额

8利息及费用 = 已计提(罚息,逾期息费,融资管理费,融券管理费,融资利息,融券利息)

注:

∑[(融资买入证券市值-融资买入金额)×折算率]、∑[(融券卖出金额-融券卖出证券市值)×折算率]中的折算率是指融资买入、

融券卖出证券对应的折算率(调出担保品范围的按0%计算);当融资买入证券市值低于融资买入金额或融券卖出证券市值高于融

券卖出金额时,折算率按100%计算

注意:负债代码

1. 移除证券公式标的物,保证金比例为100%

2. 移除证券公式担保物,保证金比例为100%,折算率为0%

3. 移除交易所标的物,同1

4. 移除交易所担保物,同2

*/

declare @CapitalAccount varchar(50)
declare @RZRQCapitalAccountID int
----------------------------------------------------------------------------------------
declare @LastPriceA  decimal(20,3)     --代码000002的市价
declare @ExchangRateA  decimal(20,3)   --代码000002的折算率
declare @RZMarginRatioA decimal(20,3)  --代码000002的融资保证金比例
declare @RQMarginRatioA decimal(20,3)  --代码000002的融券保证金比例
----------------------------------------------------------------------------------------
declare @LastPriceB  decimal(20,3)     --代码000001的市价
declare @ExchangRateB  decimal(20,3)   --代码000001的折算率
declare @RZMarginRatioB decimal(20,3)  --代码000001的融资保证金比例
declare @RQMarginRatioB decimal(20,3)  --代码000001的融券保证金比例
----------------------------------------------------------------------------------------
declare @LastPriceC  decimal(20,3)     --代码000005的市价
declare @ExchangRateC  decimal(20,3)   --代码000005的折算率
declare @RZMarginRatioC decimal(20,3)  --代码000005的融资保证金比例
declare @RQMarginRatioC decimal(20,3)  --代码000005的融券保证金比例
----------------------------------------------------------------------------------------
set @CapitalAccount='030000000207'
set @RZRQCapitalAccountID='1'
set @LastPriceA=10.8
set @LastPriceB=21.67
set @LastPriceC=2.72
set @ExchangRateA=0.75
set @ExchangRateB=0.75
set @ExchangRateC=0.75
set @RZMarginRatioA=0.8
set @RZMarginRatioB=0.8
set @RZMarginRatioC=0.8
set @RQMarginRatioA=0.8
set @RQMarginRatioB=0.8
set @RQMarginRatioC=0.8

declare @CashMoney decimal(20,3)  --总现金
declare @HoldMoney decimal(20,3)  --可冲抵保证金的证券市值折算
declare @RZMoney decimal(20,3) --融资盈亏折算
declare @RQMoney decimal(20,3) --融券盈亏折算
declare @RQSumMoney decimal(20,3)  --融券卖出总金额
declare @RZLiabilitiesMoney decimal(20,3)  --融资负债占用保证金
declare @RQLiabilitiesMoney decimal(20,3) --融券负债占用保证金
declare @InterestMoney decimal(20,3) --总利息
declare @FreezeMoney decimal(20,3) --冻结保证金

--现金
SELECT @CashMoney=isnull(tempE.总现金,0) FROM
(
SELECT [RZRQCapitalAccountID],SUM(tempA.自有可用+tempA.自有冻结+tempA.融券可用+tempA.融券冻结) [总现金] FROM
(
--信用账户资金内存表
SELECT [RZRQCapitalAccountID],SUM([AvailableCapitalDelta]) [自有可用],SUM([FreezeCapitalTotalDelta]) [自有冻结],
SUM([RQAvailableCapital]) [融券可用],SUM([RQFreezeAvailableCapital]) [融券冻结]
FROM [VTS_ReckoningCounter].dbo.[RZRQ_CapitalAccountTable_Delta]
where [RZRQCapitalAccountID]=@RZRQCapitalAccountID
group by [RZRQCapitalAccountID]
union all
--信用账户资金表
SELECT [RZRQCapitalAccountID],[AvailableCapital],[FreezeCapitalTotal],[RQAvailableCapital],[RQFreezeAvailableCapital]
FROM [VTS_ReckoningCounter].dbo.[RZRQ_CapitalAccountTable]
where [RZRQCapitalAccountID]=@RZRQCapitalAccountID
) tempA group by [RZRQCapitalAccountID]
) tempE,
(SELECT * FROM [VTS_ReckoningCounter].dbo.[RZRQ_CapitalAccountTable]) tempF
where tempE.RZRQCapitalAccountID=tempF.RZRQCapitalAccountID

print '1、总现金='+convert(varchar(20),@CashMoney)
----------------------------------------------------------------------------------------
declare @CodeNum int    --定义可充抵保证金的代码记录数量

--可充抵保证金的证券市值*折算率
SELECT @HoldMoney=isnull(SUM(tempA.总信用持仓*tempA.市价*tempA.折算率),0) FROM
(
SELECT [CapitalAccount],[code]
,[XYHoldAmount]+[XYReckonFreezeAmount] [总信用持仓]
,[市价]=case code when '000002' then @LastPriceA
when '000001' then @LastPriceB
when '000005' then @LastPriceC
end
,[折算率]=case code when '000002' then @ExchangRateA
when '000001' then @ExchangRateB
when '000005' then @ExchangRateC
end
FROM [VTS_ReckoningCounter].dbo.[RZRQ_HoldAccount]
WHERE  [CapitalAccount]=@CapitalAccount
and [code] in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityMortagagedCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount))
) tempA
group by tempA.CapitalAccount

SELECT @CodeNum=count(*) FROM [VTS_ReckoningCounter].dbo.[RZRQ_HoldAccount]
WHERE  [CapitalAccount]=@CapitalAccount
and [code] in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityMortagagedCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount))
if(@CodeNum=0)
begin
set @HoldMoney=0
print '2、可充抵保证金的证券市值折算=0------(没有任何可充抵担保物代码)'
end
else
print '2、可充抵保证金的证券市值折算='+convert(varchar(20),@HoldMoney)

----------------------------------------------------------------------------------------
declare @CodeNumZ int     --定义具有的持仓代码记录数量

--(融资买入证券市值-融资买入金额)×折算率
SELECT @RZMoney=isnull(SUM(tempD.融资盈亏*tempD.折算率),0) FROM
(
SELECT tempC.CapitalAccount,tempC.Code,tempC.融资盈亏
,[折算率]=case when (code='000002' and [融资盈亏]>0) then @ExchangRateA
when (code='000002' and [融资盈亏]<=0) then 1
when (code='000001' and [融资盈亏]>0) then @ExchangRateB
when (code='000001' and [融资盈亏]<=0) then 1
when (code='000005' and [融资盈亏]>0) then @ExchangRateC
when (code='000005' and [融资盈亏]<=0) then 1
end
FROM
(
SELECT tempB.CapitalAccount,tempB.Code,SUM(tempB.融资买入证券市值) [融资盈亏] FROM
(
SELECT tempA.CapitalAccount,tempA.Code,tempA.融资总持仓*tempA.市价 [融资买入证券市值] FROM
(
SELECT [CapitalAccount],[code]
,[RZHoldAmount]+ [RZReckonFreezeAmount] [融资总持仓]
,[市价]=case code when '000002' then @LastPriceA
when '000001' then @LastPriceB
when '000005' then @LastPriceC
end
FROM [VTS_ReckoningCounter].dbo.[RZRQ_HoldAccount]
WHERE  [CapitalAccount]=@CapitalAccount
) tempA
union all
SELECT [CapitalAccount],[Code],-1*SUM([RZBuyLiabilitiesSum]-[PayBackSum]) [融资买入金额]
FROM [VTS_ReckoningCounter].dbo.[RZRQ_RZLiabilities]
where  [CapitalAccount]=@CapitalAccount
group by [CapitalAccount],[Code]
) tempB group by tempB.CapitalAccount,tempB.Code
) tempC where Code in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityMortagagedCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount))
) tempD  group by tempD.CapitalAccount

SELECT @CodeNumZ=COUNT(*) FROM [VTS_ReckoningCounter].dbo.[RZRQ_HoldAccount]
WHERE  [CapitalAccount]=@CapitalAccount
if(@CodeNum=0)
begin
set @RZMoney=0
print '3、融资盈亏折算=0----(没有任何持仓代码记录)'
end
else
print '3、融资盈亏折算='+convert(varchar(20),@RZMoney)

----------------------------------------------------------------------------------------
declare @CodeNumRQ int     --定义具有的融券负债记录数量

--(融券卖出金额-融券卖出证券市值)×折算率
SELECT @RQMoney=isnull(SUM(tempD.融券盈亏*tempD.折算率),0) FROM
(
SELECT tempC.CapitalAccount,tempC.Code,tempC.融券盈亏
,[折算率]=case when (code='000002' and [融券盈亏]>0) then @ExchangRateA
when (code='000002' and [融券盈亏]<=0) then 1
when (code='000001' and [融券盈亏]>0) then @ExchangRateB
when (code='000001' and [融券盈亏]<=0) then 1
when (code='000005' and [融券盈亏]>0) then @ExchangRateC
when (code='000005' and [融券盈亏]<=0) then 1
end
FROM
(
SELECT tempB.CapitalAccount,tempB.Code,SUM(tempB.融券卖出金额) [融券盈亏] FROM
(
SELECT [CapitalAccount],[Code],SUM(([RQBuyAmount]-[PayBackSum])*[TradePrice]-[CostAmount]) [融券卖出金额]
FROM [VTS_ReckoningCounter].dbo.[RZRQ_RQLiabilities]
where  [CapitalAccount]=@CapitalAccount
group by [CapitalAccount],[Code]
union all
SELECT tempA.CapitalAccount,tempA.Code,-1*tempA.未还融券数量*tempA.市价 [融券卖出证券市值] FROM
(
SELECT [CapitalAccount],[Code],SUM([RQBuyAmount]-[PayBackSum]) [未还融券数量]
,[市价]=case code when '000002' then @LastPriceA
when '000001' then @LastPriceB
when '000005' then @LastPriceC
end
FROM [VTS_ReckoningCounter].dbo.[RZRQ_RQLiabilities]
where  [CapitalAccount]=@CapitalAccount
group by [CapitalAccount],[Code]
) tempA
) tempB group by tempB.CapitalAccount,tempB.Code
) tempC where Code in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityMortagagedCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount))
) tempD group by CapitalAccount

SELECT @CodeNumRQ=COUNT(*) FROM [VTS_ReckoningCounter].dbo.[RZRQ_RQLiabilities]
where  [CapitalAccount]=@CapitalAccount

if(@CodeNumRQ=0)
begin
set @RQMoney=0
print '4、融券盈亏折算=0----(没有任何融券负债记录)'
end
else
print '4、融券盈亏折算='+convert(varchar(20),@RQMoney)

----------------------------------------------------------------------------------------
--融券卖出金额
SELECT @RQSumMoney=isnull(SUM(tempA.融券卖出金额),0) FROM
(
SELECT [CapitalAccount],[Code],SUM(([RQBuyAmount]-[PayBackSum])*[TradePrice]-[CostAmount]) [融券卖出金额]
FROM [VTS_ReckoningCounter].dbo.[RZRQ_RQLiabilities]
where  [CapitalAccount]=@CapitalAccount
group by [CapitalAccount],[Code]
) tempA group by [CapitalAccount]

if(@CodeNumRQ=0)
begin
set @RQSumMoney=0
print '5、融券卖出总金额=0----(没有任何融券负债记录)'
end
else
print '5、融券卖出总金额='+convert(varchar(20),@RQSumMoney)

-------------------------------------------------------------------------------------------------------------------------
declare @CodeNumRZ int     --定义具有的融资负债记录数量

--融资买入证券金额*融资保证金比例
SELECT @RZLiabilitiesMoney=isnull(SUM(tempA.融资买入金额*tempA.融资保证金比例),0) FROM
(
SELECT [CapitalAccount],[Code],SUM(([RZBuyLiabilitiesSum]-[PayBackSum])) [融资买入金额]
,[融资保证金比例]=case when ([Code]='000002' and Code in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityUnderlyingCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount))) then @RZMarginRatioA
when ([Code]='000002' and Code not in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityUnderlyingCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount))) then 1
when ([Code]='000001' and Code in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityUnderlyingCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount))) then @RZMarginRatioB
when ([Code]='000001' and Code not in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityUnderlyingCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount))) then 1
when  ([Code]='000005' and Code in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityUnderlyingCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount)))  then @RZMarginRatioC
when  ([Code]='000005' and Code not in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityUnderlyingCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount)))  then 1
end
FROM [VTS_ReckoningCounter].dbo.[RZRQ_RZLiabilities]
where  [CapitalAccount]=@CapitalAccount
group by [CapitalAccount],[Code]
) tempA group by [CapitalAccount]

SELECT @CodeNumRZ=COUNT(*) FROM [VTS_ReckoningCounter].dbo.[RZRQ_RZLiabilities]
where  [CapitalAccount]=@CapitalAccount

if(@CodeNumRZ=0)
begin
set @RZLiabilitiesMoney=0
print '6、融资负债占用保证金=0----(没有任何融资负债记录)'
end
else
print '6、融资负债占用保证金='+convert(varchar(20),@RZLiabilitiesMoney)

----------------------------------------------------------------------------------------
--融券卖出证券市值*融券保证金比例
SELECT @RQLiabilitiesMoney=isnull(SUM(tempB.融券卖出证券市值*tempB.融券保证金比例),0) FROM
(
SELECT tempA.CapitalAccount,tempA.Code,tempA.未还融券数量*tempA.市价 [融券卖出证券市值]
,[融券保证金比例]=case when ([Code]='000002' and Code in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityUnderlyingCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount))) then @RQMarginRatioA
when ([Code]='000002' and Code not in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityUnderlyingCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount))) then 1
when ([Code]='000001' and Code in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityUnderlyingCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount))) then @RQMarginRatioB
when ([Code]='000001' and Code not in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityUnderlyingCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount))) then 1
when  ([Code]='000005' and Code in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityUnderlyingCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount)))  then @RQMarginRatioC
when  ([Code]='000005' and Code not in (SELECT [code] FROM [VTS_ManagementCenter].[dbo].[RZRQ_SecurityUnderlyingCode]
where [SecurityCompanyID]=(SELECT [SecurityCompanyID] FROM [VTS_ManagementCenter].[dbo].[RZRQ_TraderBasicInfo]
where [RZRQCapitalAccount]=@CapitalAccount)))  then 1
end
FROM
(
SELECT [CapitalAccount],[Code],SUM([RQBuyAmount]-[PayBackSum]) [未还融券数量]
,[市价]=case code when '000002' then @LastPriceA
when '000001' then @LastPriceB
when '000005' then @LastPriceC
end
FROM [VTS_ReckoningCounter].dbo.[RZRQ_RQLiabilities]
where  [CapitalAccount]=@CapitalAccount
group by [CapitalAccount],[Code]
) tempA
) tempB group by [CapitalAccount]

if(@CodeNumRQ=0)
begin
set @RQLiabilitiesMoney=0
print '7、融券负债占用保证金=0----(没有任何融券负债记录)'
end
else
print '7、融券负债占用保证金='+convert(varchar(20),@RQLiabilitiesMoney)

----------------------------------------------------------------------------------------
--费用以及利息
SELECT @InterestMoney=isnull(SUM(tempM.总费用),0) FROM
(
SELECT tempF.CapitalAccount,tempA.[罚息]+tempA.[逾期息费]+tempA.[融资额度占用费]+tempA.[融券额度占用费] [总费用] FROM
(
--信用账户资金内存表
SELECT [RZRQCapitalAccountID],SUM([ChargeTotalDelta]) [罚息],SUM([LateChargeTotalDelta]) [逾期息费],
SUM([RZLimitDisplayTotalDelta]) [融资额度占用费],SUM([RQLimitDisplayTotalDelta]) [融券额度占用费]
FROM [VTS_ReckoningCounter].dbo.[RZRQ_CapitalAccountTable_Delta]
where [RZRQCapitalAccountID]=@RZRQCapitalAccountID
group by [RZRQCapitalAccountID]
union all
--信用账户资金表
SELECT [RZRQCapitalAccountID],[Charge],[LateCharge],[RZLimitDisplay],[RQLimitDisplay]
FROM [VTS_ReckoningCounter].dbo.[RZRQ_CapitalAccountTable]
where [RZRQCapitalAccountID]=@RZRQCapitalAccountID
) tempA,
(
SELECT * FROM [VTS_ReckoningCounter].dbo.[RZRQ_CapitalAccountTable]
where [CapitalAccount]=@CapitalAccount
) tempF
where tempA.RZRQCapitalAccountID=tempF.RZRQCapitalAccountID
union all
SELECT tempA.CapitalAccount,tempA.融资利息+tempB.融券利息 [总利息] FROM
(SELECT [CapitalAccount],SUM([RZInterestSum]-[PayBackRZInterestSum]) [融资利息] FROM [VTS_ReckoningCounter].dbo.[RZRQ_RZLiabilities]
where [CapitalAccount]=@CapitalAccount
group by [CapitalAccount]) tempA,
(SELECT [CapitalAccount],SUM([RQInterestSum]-[PayBackRQInterestSum]) [融券利息] FROM [VTS_ReckoningCounter].dbo.[RZRQ_RQLiabilities]
where [CapitalAccount]=@CapitalAccount
group by [CapitalAccount]) tempB
where tempA.CapitalAccount=tempB.CapitalAccount
) tempM
group by CapitalAccount

print '8、总利息='+convert(varchar(20),@InterestMoney)

----------------------------------------------------------------------------------------
declare @FreezeNum int     --定义保证金冻结记录数量
--冻结中可用保证金
SELECT @FreezeMoney=isnull(SUM(FreezeAmount),0) FROM [VTS_ReckoningCounter].dbo.[RZRQ_MarginFreeze]
where [CapitalAccount]=@CapitalAccount
group by [CapitalAccount]

SELECT @FreezeNum=COUNT(*) FROM [VTS_ReckoningCounter].dbo.[RZRQ_MarginFreeze]
where [CapitalAccount]=@CapitalAccount

if(@FreezeNum=0)
begin
set @FreezeMoney=0
print '9、冻结保证金=0----(没有任何保证金冻结记录)'
end
else
print '9、 冻结保证金='+convert(varchar(20),@FreezeMoney)

declare @LastMoney decimal(20,3)
set @LastMoney=@CashMoney+@HoldMoney+@RZMoney+@RQMoney-@RQSumMoney-@RZLiabilitiesMoney-@RQLiabilitiesMoney-@InterestMoney-@FreezeMoney
print '--------------------------------------------------------------------------------'
print '10、 可用保证金余额='+convert(varchar(20),@LastMoney)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: